NOSQLテーブルスキーマを計画しようとしています。私のデータには関係がありますが、それらはほとんどの場合、リレーショナルデータベースではN:Nになります。通常の1:N関係はほとんどありません。
したがって、この場合、関係の両端から参照できるようにする暗黙の関係を作成しようとしています。Azure Table Storageを使用しているので、全文検索が利用できないことを理解しています。「オブジェクト」は、パーティションキーと行キーの組み合わせでしか取得できません。
したがって、「People」というテーブルと「Hamburgers」というテーブルがあり、テーブル内の各オブジェクトを他のテーブル内の複数のオブジェクトに関連付けることができると想像してください。ハンバーガーは多くの人に食べられ、人々はそれぞれ多くのハンバーガーを食べます。
関係はおそらく人の側に重きを置いているので、つまりハンバーガーあたりの人の数はその逆よりも多いので、次のような表でこれを処理します。
ハンブルガーテーブル
パーティションキー:1つのパーティションのみ
行キー:一意のID
ピープルテーブル
パーティションキー:1つのパーティションのみ
行キー:一意のID
「コラム」:人が食べるすべてのハンバーガーに追加の価値
ハンバーガー-人のテーブル
パーティションキー:ハンバーガー行キー
行キー:人行キー
このように、ハンバーガーを見ていて、それを食べるすべての人を見たい場合は、ハンバーガー-人のテーブルに移動し、ハンバーガーの行キーを使用して、ハンバーガーを食べるすべての人のパーティションを取得できます。
私が人のところにいて、彼/彼女が食べるすべてのハンバーガーを見たい場合、私はその人が食べるハンバーガーの行キーで追加の値を持っています。
テーブルにデータを挿入するときに、データにハンバーガーと人の関係が含まれている場合は、両方の値を適切なテーブルに挿入してから、ハンバーガーと人のテーブルを作成します。重複のないハンバーガーのリストを保持しようとした場合、最初にハンバーガーテーブルを検索して、ハンバーガーがまだそこにないことを確認する必要があります(「Whopper」のように、そこにある場合は挿入しません)もう一度)。次に、Hamburger-Peopleテーブルのハンバーガーの既存のパーティションに行を挿入する必要があります。
しかし、ほとんどの場合、重複しない要件は存在しません。
これはNOSQLスキーマへの優れたベストプラクティスアプローチですか、それとも後で問題が発生するのでしょうか?
更新また、後でデータテーブルを分割できるようにしたいのですが、この構造でどのように分割するかがわかりません。ハンバーガーテーブルに2番目のパーティションを追加すると、ハンバーガー-ピープルテーブルに追加の値を格納する必要があり、それが複雑になりすぎるかどうかはわかりません。