我是否应该使用主键id,如果表没有单独的意思?

时间:2013-03-13 20:25:02

标签: sql sql-server entity-framework

我有一个名为'Date Restriction'的表,它基本上包含以下属性:

DayId    : int
DateFrom : datetime
DateTo   : datetime
EventId  : int       // this is a foreign key

现在我访问它的方法是获取我想要的事件,然后查看相关的日期限制。

如果我不必单独引用日期限制,这是一种好的做法还是建议在此表中添加主键列?

5 个答案:

答案 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 的表。

  • 客户ID
  • 邮编
  • 国家

因此,这个客户将始终具有绑定地址,因此定义Foreign Key是可以接受的。现在,如果允许客户拥有多个地址,那么是,那么您需要一个Primary Key,因此该结构可以独立存在。

如果特定数据始终与另一个表绑定,则只需定义Foreign Key即可。显然,您的实施和对数据库的访问可能会产生影响。所以你必须要小心。如果您使用不同的技术,例如:

  • 实体框架
  • 腺苷

了解数据库和应用程序的实现和设计。

但是,如果没有Primary Key,则必须定义Indexes,以便优化数据库。由于Primary Key始终为Indexed

带索引的代理键就足够了。

很抱歉,如果我误解了您的问题,但希望这会将您指向正确的位置。