質問

キー価値のペアは適切なデータベース設計ではなく、正規化されていないなどではないことを知っていますが、この場合、それらが最も適切なソリューションであると思います。

これに対する私の言い訳といくつかの背景: :大きなアイテムのセットがテーブルのセットに押し込まれており、各アイテムには、ユーザーが選択できる任意のメタデータでタグ付けできます。ユーザーは、後でアイテムを分類、レポート、表示する方法を指定しているため、メタデータを選択できます。この特定のビジネス上の問題については、これらの次元が何であるかを言うことは(システム設計者として)私たちの場所ではありません。アイテム間で使用される一貫したキーセットはなく、場合によっては特定のキーの存在がフィルター条件として使用されます。

もう1つの背景情報、エントリが挿入されますが、更新されません。最終的にそれらは削除されます(連続的に、同じ順序で挿入されました)。

「効率的なストレージ」という質問: :これにより、クエリ(読み取り)パフォーマンスを参照しています。以下のタイプのクエリが使用されます。

  • 指定されたキー、任意の値でアイテムを取得します
  • 指定されたキーと価値のあるアイテムを取得します
  • すべてのキー名でアイテムを取得します
  • すべてのキー名と値のアイテムを取得します

基本的に、これらのオプションを考えると、どれが最良の選択ですか?:

オプション1

Items table:
item_id (integer, pk)
... item fields ...

ItemFacts table:
item_id (integer, fk)
key_name (nvarchar(64))
key_value (nvarchar(128))

オプション2

Items table:
item_id (integer, pk)
... item fields ...

Facts table:
fact_id (integer, pk)
key_name (nvarchar(64))
key_value (nvarchar(128))

ItemFacts table:
item_id (integer, fk)
fact_id (integer, fk)

(特定のキー名に使用されている/可能な値の全負荷がある可能性があるため、冗長性を減らすためにキー名が再び別のテーブルに引き出される場合、3番目のオプションがありますが、検討する価値もあります)

大まかに言えば、重複したキー/バリューマッチが大量に行われます。そのため、ストレージ効率が向上するはずです。これはちょっとしたオープンエンドの質問だと思いますが、読み取りパフォーマンスはどうですか?このクエリも紹介する場合はどうですか:?

  • 指定されたキーの値が「x」で始まるアイテムを取得します

これ以上の明確化を提供できる場合は、お知らせください。

正しい解決策はありません

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top