Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie strukturiert man ein Datenbankschema, um den 1-in-1-Million-Fall zu berücksichtigen?

Sie scheinen interessiert zu sein an:

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

Wenn Sie Abfragen wünschen Um unbelastet zu sein, definieren Sie einfach Foo. Sie können es nach Selten abfragen.

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

Jedes andere Design leidet unter der Aktualisierungskomplexität, um die Datenbank konsistent zu halten.

Sie haben einige unscharfe Bedenken, dass Rare viel kleiner als Foo ist. Aber was ist Ihre Anforderung Sind nur n von einer Million Foo-Aufzeichnungen viele:viele, bei denen Sie ein anderes Design wählen würden?

Die nächste Komplexitätsstufe ist Foo und Rare. Updates müssen die obige Gleichung wahr halten.

Es scheint äußerst unwahrscheinlich, dass es einen Vorteil bringt, die 2-oder-3-in-einer-Million-Redundanz von Foo + Rare zu reduzieren, indem man nur Boring + Rare hat und Foo daraus rekonstruiert. Es kann jedoch von Vorteil sein, einen eindeutigen Index (b) für Boring zu definieren, der besagt, dass ein b nur ein a enthält. Wenn Sie Foo brauchen:

Foo = select * from Boring union select * from Rare

Aber Ihre Updates müssen dies beibehalten

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