sql >> Database >  >> RDS >> Mysql

Hoe een databaseschema te structureren om rekening te houden met het geval van 1 op een miljoen?

Je lijkt geïnteresseerd in:

-- a and b are related by the association of interest
Foo(a, b)

-- foo(a, b) but not foo(a2, b) for some a2 <> a
Boring(a, b)
unique(b)
FK (a, b) references Foo

-- foo(a, b) and foo(a2, b) for some a2 <> a
Rare(a, b)
FK (a, b) references foo

Als u vragen wilt om onbelast te zijn, definieer gewoon Foo. Je kunt het opvragen voor Zeldzaam.

Rare = select * from Foo f join Foo f2
    where f.a <> f2.a and f.b = f2.b

Elk ander ontwerp lijdt aan de complexiteit van updates om de database consistent te houden.

Je hebt een vaag vermoeden dat Rare veel kleiner is dan Foo. Maar wat is uw vereiste zijn er maar n op een miljoen Foo-records, veel:veel waarmee je een ander ontwerp zou kiezen?

Het volgende niveau van complexiteit is om Foo en Rare te hebben. Updates moeten de bovenstaande vergelijking waar houden.

Het lijkt uiterst onwaarschijnlijk dat er een voordeel is bij het verminderen van de 2- of-3-in-a-miljoen redundantie van Foo + Rare door alleen Boring + Rare te gebruiken en Foo daaruit te reconstrueren. Maar het kan nuttig zijn om een ​​unieke index (b) voor Boring te definiëren die volhoudt dat a b daarin slechts één a heeft. Wanneer je Foo nodig hebt:

Foo = select * from Boring union select * from Rare

Maar uw updates moeten dat behouden

not exists (select * from Boring b join Rare r where b.b = r.b)


  1. databaseontwerp voor meldingsinstellingen

  2. MySQL (5.7) laat opgeslagen procedures vallen via mysql.proc

  3. Hoe Django QuerySet te schrijven om UNIX_TIMESTAMP van een DateTimeField te krijgen?

  4. Twee inserts in PHP/MySQL met LAST_INSERT_ID() en rijen uit een andere tabel