使用1:n + n:1在同一个表之间糟糕的设计?

时间:2011-04-20 19:18:34

标签: sql linq-to-sql database-design

想象一下表1“事件”包含事件信息,但是您希望用户有机会在选定的几个日期中标记一个日期(因为有几个日期是正确的意见)。所以日期实际上会存储在表2“事件”中。

当然,“事件”到“日期”表之间需要有n:1的关系,因此每个事件可能有多个日期。但是,从“事件”到“日期”添加1:n关系以存储“事件”记录的当前所选日期是不错的做法?

另一种选择显然是在表“Date”(“Selected”)中存储一个标志,但我认为在“事件”表上读取访问速度不会那么快。特别是在LINQ2SQL中,如果存在1:n关系,那么访问日期信息会非常容易。

(由于维护,我不想在“事件”表中另外存储实际的“选定”日期值 - 如果选择了不同的“首选”日期并且大约有6个,则必须手动处理它日期字段来处理各种日期信息)

4 个答案:

答案 0 :(得分:4)

首先,我当然希望您的表名不是Table1Table2。请尽量使用您问题中指定的表格,如果可能的话

不,这不是一个坏主意,只需使用主键和外键即可轻松表示您的要求。这是一个经常遇到的问题,在父表和子表之间存在1:n关系,但是要求您有一个具有特定属性的子项。例如,许多CRM系统允许每个客户使用多个地址,但只能将一个地址定义为主要地址。

最简单的情况是:

Event
------------
EventID
...etc.
Primary Key (EventID)

EventDate
-----------
EventID
Date
Primary Key (EventID, Date)
Foreign Key (EventID) references Event (EventID)

然后,一旦存在这些表,就可以向SelectedDate添加一个可为空的Event列,并使用{{1}在Event上引用EventDate的外键约束}和EventID

答案 1 :(得分:0)

是的,这是糟糕的设计。你应该有一个事件表,一个日期表,以及它们之间的m:n映射表。

答案 2 :(得分:0)

enter image description here

您可以(或可能不)在UserID, EventID表格中的UserSchedule上放置唯一约束。

答案 3 :(得分:0)

就数据模型而言,如果它准确描述了您试图表达的现实,那么它并非“坏”或不正确。不幸的是,SQL DBMS在执行这种周期性约束时遇到了麻烦。要在SQL中完成它,您通常必须妥协 - 通常通过创建一个额外的表来表示事件和日期之间的关系。