商用アプリケーションを開発します。お客様はカスタムフィールドのサポートを求めています。たとえば、顧客フォームにフィールドを追加したいとします。
フィールド値とフィールドに関するメタデータを格納するための既知のデザインパターンは何ですか?
今のところ、次のオプションが表示されます。
オプション1:varchar型のField1、Field2、Field3、Field4列をCustomerテーブルに追加します。
オプション2:顧客テーブルにXMLタイプの単一の列を追加し、カスタムフィールドの値をxmlに格納します。
オプション3:varchar型の列を持つCustomerCustomFieldValueテーブルを追加し、その列に値を格納します。そのテーブルには、CustomerID、CustomFieldIDも含まれます。
CustomerID, CustomFieldID, Value
10001, 1001, '02/12/2009 8:00 AM'
10001, 1002, '18.26'
10002, 1001, '01/12/2009 8:00 AM'
10002, 1002, '50.26'
CustomFieldIDは、CustomFieldID、FieldName、FieldValueTypeIDの列を持つCustomFieldという別のテーブルのIDになります。
オプション4:可能な各値タイプの列を持つCustomerCustomFieldValueテーブルを追加し、右側の列に値を格納します。#3と似ていますが、フィールド値は強い型の列を使用して格納されます。
CustomerID, CustomFieldID, DateValue, StringValue, NumericValue
10001, 1001, 02/12/2009 8:00 AM, null, null
10001, 1002, null, null, 18.26
10002, 1001, 01/12/2009 8:00 AM, null, null
10002, 1002, null, null, 50.26
オプション5:オプション3および4は、単一の概念(顧客)に固有のテーブルを使用します。私たちのクライアントは、他の形式のカスタムフィールドも求めています。代わりに、システム全体のカスタムフィールドストレージシステムを用意する必要がありますか?したがって、CustomerCustomFieldValue、EmployeeCustomFieldValue、InvoiceCustomFieldValueなどの複数のテーブルを使用する代わりに、CustomFieldValueという名前の単一のテーブルを使用しますか?私にはもっとエレガントに見えますが、それがパフォーマンスのボトルネックになるのではないでしょうか。
これらのアプローチのいずれかを使用しましたか?成功しましたか?どのアプローチを選択しますか?私が考慮すべき他のアプローチを知っていますか?
また、私のクライアントは、カスタムフィールドが他のテーブルのデータを参照できるようにしたいと考えています。たとえば、クライアントは「お気に入りの支払い方法」フィールドを顧客に追加したい場合があります。支払い方法は、システムの他の場所で定義されています。それは写真の「外部キー」の主題をもたらします。カスタムフィールドテーブルに格納されている値が有効な値であることを確認するために、制約を作成する必要がありますか?
ありがとう
======================
2009年7月27日編集:
ご回答ありがとうございます。アプローチのリストは今ではかなり包括的であるように思われます。オプション2(単一のXML列)を選択しました。今のところ、実装するのが最も簡単でした。要件がより複雑になり、サポートするカスタムフィールドの数が増えるため、より厳密に定義されたアプローチに抵抗する必要があります。