sql >> Databasteknik >  >> RDS >> Mysql

Hur strukturerar man ett databasschema för att tillåta 1 på en miljon fall?

Du verkar vara intresserad av:

-- 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

Om du vill ha frågor för att vara obehindrad, definiera bara Foo. Du kan fråga efter Rare.

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

All annan design lider av uppdateringskomplexitet för att hålla databasen konsekvent.

Du har en suddig oro över att Rare är mycket mindre än Foo. Men vad är ditt krav finns det bara n i en miljon Foo-skivor som är många:många med vilka du skulle välja någon annan design?

Nästa nivå av komplexitet är att ha Foo och Rare. Uppdateringar måste hålla ovanstående ekvation sann.

Det verkar extremt osannolikt att det finns en fördel med att minska 2-eller-3-på-en-miljon-redundansen för Foo + Rare genom att bara ha Boring + Rare och rekonstruera Foo från dem. Men det kan vara fördelaktigt att definiera ett unikt index (b) för Boring som kommer att hävda att ett b i det bara har ett a. När du behöver Foo:

Foo = select * from Boring union select * from Rare

Men dina uppdateringar måste behålla det

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


  1. Hur använder man HTTP-autentisering med PHP och kör sedan inmatad data mot en databas?

  2. SQL för att hitta den mest populära kategorin

  3. vänster yttre koppling där tabellerna är från två olika databassystem

  4. Fel vid skrivning av dataram från R till Redshift