RDBMSでのメタデータ/タグ付けのキー価値ペア:効率的なストレージ
-
30-10-2019 - |
質問
キー価値のペアは適切なデータベース設計ではなく、正規化されていないなどではないことを知っていますが、この場合、それらが最も適切なソリューションであると思います。
これに対する私の言い訳といくつかの背景: :大きなアイテムのセットがテーブルのセットに押し込まれており、各アイテムには、ユーザーが選択できる任意のメタデータでタグ付けできます。ユーザーは、後でアイテムを分類、レポート、表示する方法を指定しているため、メタデータを選択できます。この特定のビジネス上の問題については、これらの次元が何であるかを言うことは(システム設計者として)私たちの場所ではありません。アイテム間で使用される一貫したキーセットはなく、場合によっては特定のキーの存在がフィルター条件として使用されます。
もう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」で始まるアイテムを取得します
これ以上の明確化を提供できる場合は、お知らせください。
正しい解決策はありません