0

MySQL で次の型システムを表現したいと思います(これは階層型システムであり、階層データではありません)。

type A {
  id
  name
}

type B extends A {
  id
  name
  color
}

type C extends A {
  id
  name
  shape
}

これは、次のような継承ツリーで表されます。

     A
   /   \
  B     C

B基本的に、タイプおよびC(「リーフ」タイプ)のオブジェクトのセットを MySQL データベースに格納したいと考えています。また、オブジェクトのセットに対して、以下の各サンプル クエリを実行したいと考えています。

  1. SORT BY オフセット 0 制限 10Aname始まるタイプのオブジェクトを取得しますtetraname
  2. SORT BY オフセット 10 制限 10Bcolorあるタイプのオブジェクトを取得しますbluename
  3. SORT BY制限10のタイプCのオブジェクトを取得しますshapesquareid

これらの要件を満たすのに最適な MySQL スキーマは何かと考えていました。


これが私の現在のアプローチですが、大幅な非正規化が必要になるため、先に進むのをためらっています。

// global "reference" table containing all fields
// you can filter or sort by
table Objects {
  id (required) 
  name (required)
  color (optional)
}

table ObjectsOfTypeB {
  id (required)
  name (required)
  color (required)
}

table ObjectsOfTypeC {
  id (required)
  name (required)
  shape (optional)
}

したがって、上記のクエリのいずれについても、Objectsテーブルを参照してフィルタリング/並べ替え/ページネーションを実行します。次に、結果の を返し、個々の ObjectOfType テーブルでidそれらの を解決できます。idここでの欠点は、「参照」テーブルをすべての個々の型テーブルと同期させておく必要があり、データ ストレージを複製していることです。

または、複数の個別のクエリを実行してからメモリ内で結合することも考えました。クエリ #1 ( SORT BYオフセット 0 リミット 10Aname始まるタイプのオブジェクトを取得する) を例にとると、アプローチは次のようになります。tetraname

  1. SORT BY limit 10Bname始まるタイプのオブジェクトを取得しますtetraname
  2. SORT BY limit 10Cname始まるタイプのオブジェクトを取得しますtetraname
  3. 結果をマージして、最初の 10 個を返します。B と C のそれぞれから取得した要素の数を記録する複雑なカーソルを返します。これは、後続のページ付けに使用できます。

このアプローチの欠点の 1 つは、ここでのページネーションが非常に複雑になり、特に型システムの「ファンアウト」が大きい場合に、MySQL に追加の作業が追加される可能性があることです。

この問題に関するヒントをいただければ幸いです。ありがとう!

4

0 に答える 0