2017-10-13 4 views
2

私は0個以上の設定可能なプロパティを持つことができる "ルートオブジェクト"を作成する必要があるシステムで作業しています。値を持つカスタムプロパティを持つオブジェクトを持つデータベースをモデル化する最良の方法

その顧客は、私たちが常にcustomerId、名前、生年月日を保存することを知っているとしましょう。これはテーブルの列です。しかし、システムは顧客のためにカスタムプロパティを扱うことができるはずです。

このシステムのユーザーは、この顧客の都市、電話、電子メールを保存したいとします。どのように私はこれをサポートするための最良の方法でデータベースをモデル化しますか?

これは私がテーブルの面で考えているものです:

Customer 
- CustomerId 
- Name 
- Birthdate 

CustomerProperties 
- CustomerPropertyId 
- Name 

CustomerPropertyValues 
- Id 
- CustomerId 
- CustomerPropertyId 
- Value 

これは「市は」-table「CustomerProperties」にCustomerPropertyだろうし、そのプロパティの値は次のようになり設定してCustomerPropertyValuesテーブルのエントリとして保存されます。

このようにして、私は都市Xのすべての顧客をSQLで照会することができます。

私はすべてのカスタムプロパティをjson blobとして保存しようと考えていましたが、これはクエリを非常に難しくし、これはうまく行かないと思います。

私が思っているのは、これはdb-modolの私の例ですか?これをモデル化する良い方法はありますか?これに関してパフォーマンスや課題などの点で「認識しておくべきこと」は何か?

ご協力ありがとうございます。

+1

https://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model – kwarunek

+1

この呼ばれるエンティティ属性値モデルhttps://en.wikipedia.org/wiki/Entity% E2%80%93attribute%E2%80%93value_modelと反パターンと考えられていますが、多くはその "良い解決策"と主張しているようです。 –

+0

@AlekseiMaideありがとう!私はこの "エンティティ属性値モデル"の "正式な"名前について知らなかった - ありがとう!だからこれが反パターンであるなら、私はどのように問題に近づくだろうか? –

答えて

2

が何度も使いやすさのために私自身のアプローチを同様の何かをしなければならなかったしたので、メンテナンス性と堅牢性は次のようになります。

Customer 
- CustomerId 
- Name 
- Birthdate 

CustomerProperties 
- CustomerPropertyId 
- CustomerId 
- Name 
- DataType 
- Value 

あなたが保つことを期待するレコード数と異なるタイプのデータに応じて、

Customer 
- CustomerId 
- Name 
- Birthdate 

CustomerDateTimeProperties 
- CustomerPropertyId 
- CustomerId 
- Name 
- Value 

CustomerIntegerProperties 
- CustomerPropertyId 
- CustomerId 
- Name 
- Value 

CustomerStringProperties 
- CustomerPropertyId 
- CustomerId 
- Name 
- Value 

は、値フィールドのデータ型を設定することができ、あなたはすべての型キャストを避ける:あなたは、各データ型のために別のテーブルを追加することによって、それを正規化することを望むかもしれません。 これは過去に私にとって一番うまくいったアプローチです。これが役立つことを願っています。

顧客のすべてのプロパティを取得するには:

SELECT * FROM Customer, CustomerDateTimeProperties, CustomerIntegerProperties 
INNER JOIN CustomerDateTimeProperties ON CustomerDateTimeProperties.CustomerId = Customer.CustomerId 
INNER JOIN CustomerIntegerProperties ON CustomerIntegerProperties .CustomerId = Customer.CustomerId 

INNER JOIN etc... 

WHERE Customer.CustomerId = @CustomerId 

あなただけの1がCustomerPropertiesテーブルに結合を使用私の最初の例を使用している場合。

+0

ありがとう!私は、データ型がテーブル上の異なる列として格納されている解決策を見てきました。int、string、datetime、nvarchar(max) 質問:「CustomerProperties」テーブルをスキップすると、すべてのプロパティをリストし、正しいタイプの入力を表示しますか? –

+0

私は自分の質問を理解できるかどうか分からないので、私は自分の答えを編集して質問を追加しました。 これはあなたの意志ですか? – sanepete

+0

こんにちは、ありがとう! - CustomerPropertyId - CustomerIdの - DateTimeValue - - 名前IntValue(int)を CustomerProperties :1つのテーブルではなく、右のデータ型を持つ列のすべての種類を格納して任意の大きな欠点が存在することになる場合 は、私は何を意味しています - StringValue(string) - DateTimeValue(DateTime) データ型ごとに1つのテーブルを作成する必要がないようにするには? –

関連する問題