我有一个叫做“日期限制”表,它基本上拥有以下特性:如果表格无意义,我应该使用主键ID吗?
DayId : int
DateFrom : datetime
DateTo : datetime
EventId : int // this is a foreign key
现在我将访问这个办法是得到我想要的事件,然后看看相关的日期限制。
如果我不需要单独引用日期限制,是不是很好的做法或建议将主键列添加到此表中?
我有一个叫做“日期限制”表,它基本上拥有以下特性:如果表格无意义,我应该使用主键ID吗?
DayId : int
DateFrom : datetime
DateTo : datetime
EventId : int // this is a foreign key
现在我将访问这个办法是得到我想要的事件,然后看看相关的日期限制。
如果我不需要单独引用日期限制,是不是很好的做法或建议将主键列添加到此表中?
你应该总是有一个主键。拥有主键将允许SQL Server以更高效的方式物理存储数据。主键还允许实体框架轻松地唯一标识一行。
在您的列中查找自然键。如果单个EventId在此表中只有一行,请在EventId上创建一个主键。
如果没有自然键,请将代理键列添加到您的表中并将其设为标识。
您需要告诉EF如何唯一标识数据库中的一行。如果每个事件只在表中出现一次,则可以使EventId都是主键和外键。您也可以将所有三列都设为复合主键。例如:
class DateRestriction {
[Key, Column(Order=0)]
public DateTime DateFrom {get;set;}
[Key, Column(Order=1)]
public DateTime DateTo {get;set;}
[Key, Column(Order=2)]
public int EventId {get;set;}
}
如果您的数据库中的这张表直接引用另一个表,那么没有。没有你的结构的其余部分,我不完全确定。所以,我会提供一个一般的经验法则用一个例子:
客户表:
但你不会查询一个个人地址,而不是没有将其链接到一个人。所以你有第二个表叫地址。
所以这一个客户将永远有一个绑地址,所以定义Foreign Key
是可以接受的。现在,如果一个客户被允许有多于一个地址那么是的,你需要一个Primary Key
,所以这个结构是独立的。
如果该特定数据总是绑定到另一个表,则可以定义Foreign Key
。很明显,您的实施和访问数据库可能会产生影响。所以你必须保持警惕。如果您使用不同的技术,如:
因此意识到实现两者的数据库和应用程序的设计。
但是,如果没有Primary Key
,您必须定义Indexes
,以便您可以优化数据库。由于Primary Key
总是Indexed
。
带索引的代理键就足够了。
对不起,如果我误解了你的问题,但希望这会指出你在正确的位置。
作为一个数据库设计实践,总是建议使用主键。即使您的应用程序没有直接引用DateRestriction表,对于一行有一个唯一标识,不仅可以在SQL方面获益,还可以让实体框架轻松映射表(不经过任何额外的箍环)。
我建议有一个代理键并使用自然键创建唯一索引。
为什么(EventId,DateFrom)或(EventId,DateFrom,DateTo)中的一个不是该表的自然PK。你真的想允许重复吗? – 2013-03-13 20:30:50
我相信你无论如何都需要PK,否则你最终会有重复。问题是你想要自然的还是合成的。你正在计划管理该表更新,删除它的记录,对吧?如果是这样的话,那么合成PK是一个很好且一致的方式来针对特定的行,特别是如果你的应用程序(客户端代码)ID用于其他实体(表)的整个地方。 – peterm 2013-03-13 20:34:45