未知の量のメタデータ用にデータベースを設計する方法
-
22-07-2019 - |
質問
可変量のプロパティで特定のアイテムをデータベースに保存したい。
例:
アイテムには「url」プロパティと「pdf」プロパティを設定できますが、他のプロパティには「image」プロパティと「location」プロパティを設定することはできません。
問題は、いくつかのアイテムがいくつかのプロパティを持ち、他のアイテムがたくさん持つことができることです。
このデータベースをどのように設計しますか。検索可能かつ高性能にする方法
スキーマはどのようになりますか
ありがとう!
解決
後のものには名前があります-エンティティ属性値(EAV) 。 "「もの」(「エンティティ」または「オブジェクト」)を記述するために使用できる属性(プロパティ、パラメータ)の数が潜在的に非常に膨大な状況で使用されるデータモデルです。ただし、特定のエンティティに実際に適用される数値は比較的控えめです。"
他のヒント
これは、文書データベースにとって完璧な仕事のように思えます。
オブジェクト(アイテム)から開始し、アイテムのテーブルを作成します。あなたのアイテムは1つまたは複数の属性を持つことができますか、まったくありませんか?そのため、一意のIDを持つ属性のテーブルを設定します。次に、多くのアイテム(一部は複製可能)と多くの属性(同様に複製可能)を保持するテーブルをセットアップします
アイテム
ItemID
アイテム説明 ...
属性
AttributeID
AttributeDescription ...
ItemAttributes
rowID
ItemID
AttributeID
クエリを実行するときに、テーブルを結合し、必要に応じてフィルタリングすることができます...
エンティティ属性値(EAV)モデルは非常に柔軟です。セマンティックWebとそのクエリ言語sparqlもEAVに基づいています。しかし、このモデルにはパフォーマンスの低下があるため、気に入らない人もいます。
データベースでいくつかの高負荷パフォーマンステストを実行することから始めます。コーディングが完了したら、それらを実行しないでください。
編集:ステートメントを選択する速度に注目してください。ユーザーは検索するときに迅速な結果を期待します。
過去にこのようなテーブルを設計して、次のフィールドを用意しました。
- id
- タイプ
- サブタイプ
- 値
そして、使用するタイプとサブタイプを定義する別のテーブルを作成し、そのタイプとサブタイプの組み合わせのデータ型を指定して、プログラムで強制できるようにします。
見た目は美しくありません。必要な場合以外は実行したくないでしょう。しかし、あなたがそうするときに見つけた最良の方法です。
更新:サブタイプを空白のままにしても、既にあるものをサブカテゴリにしたいことが多いので、持っておくと良いでしょう。タイプを作成する例:アドレス、今は郵送先住所と請求先住所と物理住所が必要です。
この種のシナリオでは、MS SQL 2005でXMLタイプの列を使用しています... XML + SQLのすべての利点があります。つまり、SQLステートメントの一部としてXPath式を使用します。
これはMS SQL 2005の機能です。他のどのRDBMSがこれをサポートしているかはわかりません。 パフォーマンスが賢明かどうかはわかりません。
次のフィールドを持つプロパティテーブルを作成します。
item_id int(またはitemテーブルにあるIDタイプは何でも) property_name varchar(500) property_value varchar(500)
item_idとアイテムのidフィールドの間に外部キーを設定すれば完了です。
これが、SQLで多対1の関係を行う方法です。
「アイテム」のように見えます;主キー" item_id"と" properties"を持つテーブル主キー" property_id"を持つテーブル外部キー" item_id" " items"表。 "プロパティ"列には「名前」列があります。および「値」、両方ともタイプvarchar。
パフォーマンス?わからない。