sql >> データベース >  >> RDS >> Mysql

100万分の1のケースを考慮してデータベーススキーマを構築するにはどうすればよいですか?

    あなたは興味があるようです:

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

    クエリが必要な場合 邪魔にならないようにするには、Fooを定義するだけです。レアを照会できます。

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

    その他の設計では、データベースの一貫性を維持する上で更新が複雑になります。

    RareがFooよりもはるかに小さいことについて、あいまいな懸念があります。しかし、あなたの要件は何ですか 100万件のFooレコードのうち、他のデザインを選択するのに必要なものはたくさんありますか?

    次のレベルの複雑さは、FooとRareを使用することです。更新では、上記の方程式を真に保つ必要があります。

    Boring + Rareを使用し、それらからFooを再構築するだけで、Foo+Rareの100万分の2または3の冗長性を削減するメリットがある可能性は非常に低いようです。ただし、ボーリングの一意のインデックス(b)を定義して、その中のbにaが1つしかないことを維持することは有益な場合があります。 Fooが必要な場合:

    Foo = select * from Boring union select * from Rare
    

    ただし、更新ではそれを維持する必要があります

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


    1. Mysql結合は重複する行を提供します

    2. #1214-使用されるテーブルタイプはFULLTEXTインデックスをサポートしていません

    3. 値のリストをテーブルと比較する

    4. CASTを使用しないVARCHARフィールドのmysqlSUM