想象一下表1“事件”包含事件信息,但是您希望用户有机会在选定的几个日期中标记一个日期(因为有几个日期是正确的意见)。所以日期实际上会存储在表2“事件”中。
当然,“事件”到“日期”表之间需要有n:1的关系,因此每个事件可能有多个日期。但是,从“事件”到“日期”添加1:n关系以存储“事件”记录的当前所选日期是不错的做法?
另一种选择显然是在表“Date”(“Selected”)中存储一个标志,但我认为在“事件”表上读取访问速度不会那么快。特别是在LINQ2SQL中,如果存在1:n关系,那么访问日期信息会非常容易。
(由于维护,我不想在“事件”表中另外存储实际的“选定”日期值 - 如果选择了不同的“首选”日期并且大约有6个,则必须手动处理它日期字段来处理各种日期信息)
答案 0 :(得分:4)
(首先,我当然希望您的表名不是Table1
和Table2
。请尽量使用您问题中指定的表格,如果可能的话)
不,这不是一个坏主意,只需使用主键和外键即可轻松表示您的要求。这是一个经常遇到的问题,在父表和子表之间存在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)
您可以(或可能不)在UserID, EventID
表格中的UserSchedule
上放置唯一约束。
答案 3 :(得分:0)
就数据模型而言,如果它准确描述了您试图表达的现实,那么它并非“坏”或不正确。不幸的是,SQL DBMS在执行这种周期性约束时遇到了麻烦。要在SQL中完成它,您通常必须妥协 - 通常通过创建一个额外的表来表示事件和日期之间的关系。