我有一个名为'Date Restriction'的表,它基本上包含以下属性:
DayId : int
DateFrom : datetime
DateTo : datetime
EventId : int // this is a foreign key
现在我访问它的方法是获取我想要的事件,然后查看相关的日期限制。
如果我不必单独引用日期限制,这是一种好的做法还是建议在此表中添加主键列?
答案 0 :(得分:5)
您应始终拥有主键。拥有主键将允许SQL Server以更有效的方式物理存储数据。主键还允许实体框架轻松唯一地标识行。
在列中查找自然键。如果单个EventId在此表中只有一行,则在EventId上创建一个主键。
如果没有自然键,请将代理键列添加到表中并使其成为标识。
答案 1 :(得分:4)
作为数据库设计实践,始终建议使用主键。即使您的应用程序没有直接引用DateRestriction Table,对行进行唯一标识也不仅可以在SQL方面获益,而且还可以让实体框架轻松映射表(无需经过任何额外的操作)。
答案 2 :(得分:1)
您需要告诉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;}
}
答案 3 :(得分:1)
我建议使用代理键并使用自然键创建唯一索引。
答案 4 :(得分:0)
如果你的数据库中的这个表直接由另一个表引用,那么没有。没有你的其余结构,我不完全确定。所以我将提供一个通用的经验法则:
客户表:
但您不会查询单个地址,也不会将其链接到某个人。所以你有第二个名为 Address 的表。
因此,这个客户将始终具有绑定地址,因此定义Foreign Key
是可以接受的。现在,如果允许客户拥有多个地址,那么是,那么您需要一个Primary Key
,因此该结构可以独立存在。
如果特定数据始终与另一个表绑定,则只需定义Foreign Key
即可。显然,您的实施和对数据库的访问可能会产生影响。所以你必须要小心。如果您使用不同的技术,例如:
了解数据库和应用程序的实现和设计。
但是,如果没有Primary Key
,则必须定义Indexes
,以便优化数据库。由于Primary Key
始终为Indexed
。
带索引的代理键就足够了。
很抱歉,如果我误解了您的问题,但希望这会将您指向正确的位置。