1

我有一个表结构,其中包含iduser和十几个其他列。我必须让我的用户选择他们希望在哪一天接收通知,我无法决定如何去做。

我不想在现有表中再添加 7 列,因为这似乎是一种不好的做法。

我想添加另一个表,然后将这两个表链接在一起,但这将包括对现有代码的大量返工(并且我必须交付此解决方案的速度是一个重要因素)。

例如,我还想在现有表中添加一列,该表将包含 7 个字符串,例如1000100,这基本上意味着在周一周五接受通知(你明白了 - 1 或 0 在数组确定那天我是否应该将通知发送到该电子邮件。

你能建议你做什么吗?

4

3 回答 3

2

您应该添加另一个表。如果添加一个简单的表需要做很多工作,那么你做错了什么。

create table user_notification_preference (
  user_id bigint not null references user (id),
  day_of_week smallint not null check (day_of_week between 0 and 6),

  primary key (user_id, day_of_week)
);
于 2012-08-29T10:37:11.627 回答
1

不要这样做:

例如,我还想过在现有表中仅添加一列,该表将包含 7 个字符串,例如 1000100,这基本上意味着在周一和周五接受通知(你明白了 - 1 或 0 在该数组确定那天我是否应该将通知发送到该电子邮件。

如果您发现自己在列中放置逻辑或代码有问题,那么您在关系数据库环境而不是 C# 程序中工作。

您只需引入一个具有用户 ID 的新表,以及他们计划获得通知的日期或日期 - 简单的一对多关系。

于 2012-08-28T20:24:52.647 回答
0

编辑

以下是我的原始答案,我现在意识到它有多糟糕。不要遵循这种模式。我会删除它,但我已经在很多地方看到它,它一定是一种常见的反模式。我正在保持它,并警告不要使用它,以便未来的访问者可以像我现在所做的那样看到为什么这很糟糕。

自从 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

推理:(外行的描述)更改列比将记录添加到数据库表中风险更大,因此如果您可以将属性转换为行而不是列,则可以减少将来的维护麻烦

于 2012-08-28T20:24:39.760 回答