バージョニングを使用して動的プロパティのスキーマを設計する際に問題が発生します。次のユースケースを想定します。
Actor
とを含むテーブルがid
ありますname
(簡単にするため)。私の場合の上限は、このテーブルに約100万のエントリが含まれていることです。
さらに、すべてのアクターにプロパティが割り当てられます。当時は物件がわからないので、物件を管理するためのテーブルが必要です。私はテーブルについて考えましたProperty
。結果のn:m関係は、主キーとプロパティ値(タイプ?)の間のテーブルで解決されActor
ますProperty
。
現時点では、これは非常に扱いやすいようです。それぞれが10個のプロパティを持つ100万個のエントリがある場合、ActorProperty
テーブルには1,000万個のノードが含まれます。btree
インデックス(log2(n))では、これは問題ないと思います。
今、私が苦労している部分が来ます。プロパティはどういうわけか追跡する必要があります。時間の経過とともにこれらのプロパティは変化しますが、履歴が失われることはありません。ほとんどの場合、タイムスタンプを使用して実行されます。複数のプロパティが同時に更新されることに注意してください。例:私は毎日すべてのアクターのスナップショットを撮り、何かが変更された場合は、変更されたすべてのプロパティを同時に更新します。これにより、1年あたり365のタイムスタンプが得られます。
別のテーブルを使用してバージョン(タイムスタンプ)を管理し、テーブルに別の外部キーを追加すると、ActorProperty
365*1,000万のエントリが得られます。これは私が今までに得た最大のものでなければなりません。ほとんどの場合、データセットは大幅に小さくなります。
私の質問は今、パフォーマンスにもっと取り組むことです。インデックスに関する次の回答を読みました。データベースのインデックス作成はどのように機能しますか。その量のエントリを含むテーブルをクエリするのは、ひどく遅いのではないでしょうか。クエリの例は次のようになります。指定されたタイムスタンプid=xですべてのプロパティを持つ最初の100人のアクター。また、私が考えているスキーマはおそらく最高ではないように感じます。よりスケーラビリティのあるスキーマについての提案やアイデアはありますか?
ちなみに、現在NoSqlのアプローチも評価しているので、とりあえずリレーショナルアプローチに集中したいと思います。私の目的は、さまざまなテクノロジーの長所と短所を収集し、説明されているユースケースの理論的なスキーマまたはモデルを用意することです。そして、リレーショナルデータベースでの最適なモデルでのパフォーマンスは、私が評価したり見つけたりするのに苦労しているようです。
ありがとう!