質問

可変量のプロパティで特定のアイテムをデータベースに保存したい。

例:

アイテムには「url」プロパティと「pdf」プロパティを設定できますが、他のプロパティには「image」プロパティと「location」プロパティを設定することはできません。

問題は、いくつかのアイテムがいくつかのプロパティを持ち、他のアイテムがたくさん持つことができることです。

このデータベースをどのように設計しますか。検索可能かつ高性能にする方法

スキーマはどのようになりますか

ありがとう!

役に立ちましたか?

解決

後のものには名前があります-エンティティ属性値(EAV)"「もの」(「エンティティ」または「オブジェクト」)を記述するために使用できる属性(プロパティ、パラメータ)の数が潜在的に非常に膨大な状況で使用されるデータモデルです。ただし、特定のエンティティに実際に適用される数値は比較的控えめです。"

他のヒント

必ずしもSQLに縛られているわけではない場合、トリプルストアはまさにこのために設計されています仕事。ほとんどは SPARQL クエリ言語でクエリされるように設計されています。

これは、文書データベースにとって完璧な仕事のように思えます。

オブジェクト(アイテム)から開始し、アイテムのテーブルを作成します。あなたのアイテムは1つまたは複数の属性を持つことができますか、まったくありませんか?そのため、一意のIDを持つ属性のテーブルを設定します。次に、多くのアイテム(一部は複製可能)と多くの属性(同様に複製可能)を保持するテーブルをセットアップします

アイテム

ItemID

アイテム説明 ...

属性

AttributeID

AttributeDescription ...

ItemAttributes

rowID

ItemID

AttributeID

クエリを実行するときに、テーブルを結合し、必要に応じてフィルタリングすることができます...

エンティティ属性値(EAV)モデルは非常に柔軟です。セマンティックWebとそのクエリ言語sparqlもEAVに基づいています。しかし、このモデルにはパフォーマンスの低下があるため、気に入らない人もいます。

データベースでいくつかの高負荷パフォーマンステストを実行することから始めます。コーディングが完了したら、それらを実行しないでください。

編集:ステートメントを選択する速度に注目してください。ユーザーは検索するときに迅速な結果を期待します。

過去にこのようなテーブルを設計して、次のフィールドを用意しました。

  1. id
  2. タイプ
  3. サブタイプ

そして、使用するタイプとサブタイプを定義する別のテーブルを作成し、そのタイプとサブタイプの組み合わせのデータ型を指定して、プログラムで強制できるようにします。

見た目は美しくありません。必要な場合以外は実行したくないでしょう。しかし、あなたがそうするときに見つけた最良の方法です。

更新:サブタイプを空白のままにしても、既にあるものをサブカテゴリにしたいことが多いので、持っておくと良いでしょう。タイプを作成する例:アドレス、今は郵送先住所と請求先住所と物理住所が必要です。

この種のシナリオでは、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。

パフォーマンス?わからない。

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