編集
以下は私の最初の答えです、そして私は今それがどれほど悪いかを理解しています。このパターンに従わないでください。削除しますが、多くの場所で見たので、一般的なアンチパターンである必要があります。私はそれを維持していますが、この警告は使用しないでください。これにより、将来の訪問者は、私が今しているように、なぜこれが悪いのかを知ることができます。
Neil McGuinanがこの回答にコメントして以来、私が読んだすべての専門家のアドバイスは、彼のアプローチがより良いものであることを示しています。理由を説明する良い記事が1つあります:http://geekswithblogs.net/darrengosbell/archive/2006/03/12/KVPsInDatabaseDesign.aspx
私たちのソリューションが「私たちのために働いた」理由は、KVPデータをピボットして、期待する構造(属性の列)を持つテーブルを生成するプロセスがあったためです。これは、設定時に属性の列を含む別のテーブルを作成したときにこれを知っていれば回避できたはずの不要なオーバーヘッドです。あなたは私たちがたどった道を進みたくありません。散らかっています。
/編集
私はAttributesという名前の新しいテーブルを設定し、次にCustomerAttributesという名前の中間(外部キー)テーブルを設定しました。そうすれば、顧客に属性を追加するために列を再度追加する必要はありません。
属性:
AttributeId AttributeName
-----------------------------
1 PreferredNotificationDayOfMonth
2 FavoriteColor
etc...
CustomerAttributes
CustomerId AttributeId AttributeValue
1 1 5
1 2 Blue
2 1 1
2 2 Red
理由:(レイマンの説明)列を変更することは、データベーステーブルにレコードを追加するよりもはるかにリスクが高いため、属性を列ではなく行にシフトできる場合は、将来のメンテナンスの問題を軽減できます。