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