编辑
以下是我的原始答案,我现在意识到它有多糟糕。不要遵循这种模式。我会删除它,但我已经在很多地方看到它,它一定是一种常见的反模式。我正在保持它,并警告不要使用它,以便未来的访问者可以像我现在所做的那样看到为什么这很糟糕。
自从 Neil McGuinan 对此答案发表评论以来,我读过的所有专家建议都表明他的方法更好。这是一篇解释原因的好文章:http: //geekswithblogs.net/darrengosbell/archive/2006/03/12/KVPsInDatabaseDesign.aspx
我们的解决方案“为我们工作”的原因是我们有一个过程,它可以旋转 KVP 数据以生成具有您期望的结构的表 - 属性的可能列。如果我们在设置时知道这一点,并且只是创建了一个包含属性列的单独表,那么这是可以避免的不必要的开销。你不想走我们走的路。很乱。
/编辑
我会设置一个名为 Attributes 的新表,然后是一个名为 CustomerAttributes 的中间(外键)表。然后,您不必再次添加列来为您的客户添加属性。
属性:
AttributeId AttributeName
-----------------------------
1 PreferredNotificationDayOfMonth
2 FavoriteColor
etc...
客户属性
CustomerId AttributeId AttributeValue
1 1 5
1 2 Blue
2 1 1
2 2 Red
推理:(外行的描述)更改列比将记录添加到数据库表中风险更大,因此如果您可以将属性转换为行而不是列,则可以减少将来的维护麻烦。