問題タブ [class-table-inheritance]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
mysql - 異なるタイプの共通属性のフィルタリングをサポートする MySQL スキーマ設計に関するアドバイスはありますか?
MySQL で次の型システムを表現したいと思います(これは階層型システムであり、階層データではありません)。
これは、次のような継承ツリーで表されます。
B
基本的に、タイプおよびC
(「リーフ」タイプ)のオブジェクトのセットを MySQL データベースに格納したいと考えています。また、オブジェクトのセットに対して、以下の各サンプル クエリを実行したいと考えています。
- SORT BY
オフセット 0 制限 10
A
でname
始まるタイプのオブジェクトを取得しますtetra
name
- SORT BY
オフセット 10 制限 10
B
でcolor
あるタイプのオブジェクトを取得しますblue
name
- SORT BY制限10のタイプ
C
のオブジェクトを取得しますshape
square
id
これらの要件を満たすのに最適な MySQL スキーマは何かと考えていました。
これが私の現在のアプローチですが、大幅な非正規化が必要になるため、先に進むのをためらっています。
したがって、上記のクエリのいずれについても、Objects
テーブルを参照してフィルタリング/並べ替え/ページネーションを実行します。次に、結果の を返し、個々の ObjectOfType テーブルでid
それらの を解決できます。id
ここでの欠点は、「参照」テーブルをすべての個々の型テーブルと同期させておく必要があり、データ ストレージを複製していることです。
または、複数の個別のクエリを実行してからメモリ内で結合することも考えました。クエリ #1 ( SORT BYオフセット 0 リミット 10A
でname
始まるタイプのオブジェクトを取得する) を例にとると、アプローチは次のようになります。tetra
name
- SORT BY limit 10
B
でname
始まるタイプのオブジェクトを取得しますtetra
name
- SORT BY limit 10
C
でname
始まるタイプのオブジェクトを取得しますtetra
name
- 結果をマージして、最初の 10 個を返します。B と C のそれぞれから取得した要素の数を記録する複雑なカーソルを返します。これは、後続のページ付けに使用できます。
このアプローチの欠点の 1 つは、ここでのページネーションが非常に複雑になり、特に型システムの「ファンアウト」が大きい場合に、MySQL に追加の作業が追加される可能性があることです。
この問題に関するヒントをいただければ幸いです。ありがとう!