sql >> Databáze >  >> RDS >> Mysql

Jak strukturovat schéma databáze tak, aby umožňovalo případ 1 z milionu?

Zdá se, že vás zajímá:

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

Pokud chcete dotazy abyste nebyli zatíženi, stačí definovat Foo. Můžete se ho zeptat na vzácné.

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

Jakýkoli jiný návrh trpí složitostí aktualizací při udržování konzistentnosti databáze.

Máte nějaké nejasné obavy z toho, že Rare je mnohem menší než Foo. Jaký je ale váš požadavek je jen n z milionu Foo záznamů je mnoho:mnoho, podle kterých byste si vybrali nějaký jiný design?

Další úrovní složitosti je mít Foo a Rare. Aktualizace musí zachovat výše uvedenou rovnici pravdivou.

Zdá se krajně nepravděpodobné, že by bylo přínosné snížit redundanci 2 nebo 3 z milionu Foo + Rare tím, že budete mít pouze Boring + Rare a rekonstruujete z nich Foo. Ale může být užitečné definovat jedinečný index (b) pro Boring, který bude tvrdit, že ab v něm má pouze jedno a. Když potřebujete Foo:

Foo = select * from Boring union select * from Rare

Ale vaše aktualizace to musí zachovat

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


  1. Existuje ekvivalent k SQL Serveru SET NOCOUNT v MySQL?

  2. mysql - Jak zřetězit řetězce a převést je na datum?

  3. SQL Server ON DELETE Trigger

  4. Vyplňte výběrové pole z databáze pomocí jQuery