sql >> Database teknologi >  >> RDS >> Mysql

Hvordan strukturerer man et databaseskema for at tillade 1 i en million tilfælde?

Du ser ud til at være interesseret i:

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

Hvis du ønsker forespørgsler for at være ubehæftet, skal du bare definere Foo. Du kan forespørge efter Rare.

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

Ethvert andet design lider under opdateringskompleksitet ved at holde databasen konsistent.

Du har en uklar bekymring over, at Rare er meget mindre end Foo. Men hvad er dit krav er der kun n i en million Foo-optegnelser, der er mange:mange, som du ville vælge et andet design med?

Det næste niveau af kompleksitet er at have Foo og Rare. Opdateringer skal holde ovenstående ligning sand.

Det virker ekstremt usandsynligt, at der er en fordel ved at reducere 2-eller-3-i-en-million-redundansen af ​​Foo + Rare ved kun at have Boring + Rare og rekonstruere Foo fra dem. Men det kan være en fordel at definere et unikt indeks (b) for Boring, som vil fastholde, at et b i sig kun har et a. Når du har brug for Foo:

Foo = select * from Boring union select * from Rare
 

Men dine opdateringer skal fastholde det

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


  1. Django emulerer databasetriggeradfærd ved masseindsættelse/opdatering/sletning

  2. ingen sqljdbc_auth i java.library.path

  3. Implementering af Django + Python 3 + PostgreSQL til AWS Elastic Beanstalk

  4. Skal dette ER-diagram bruge et ternært forhold i stedet for