4

我有一个名为“日期限制”的表,它基本上包含以下属性:

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

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

如果我永远不必单独引用日期限制,那么向该表添加主键列是一种好习惯还是建议?

4

5 回答 5

5

您应该始终拥有一个主键。拥有主键将允许 SQL Server 以更有效的方式物理存储数据。主键还允许实体框架轻松唯一地标识一行。

在你的列中寻找一个自然键。如果单个 EventId 在此表中只有一行,请在 EventId 上创建一个主键。

如果没有自然键,请将代理键列添加到表中并使其成为标识。

于 2013-03-13T20:34:22.460 回答
4

作为数据库设计实践,始终建议使用主键。即使您的应用程序不直接引用 DateRestriction 表,具有唯一标识的行不仅会给您带来 SQL 方面的好处,而且还允许实体框架轻松映射表(无需经过任何额外的环节)。

于 2013-03-13T20:36:47.937 回答
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;}
}
于 2013-03-13T20:33:41.957 回答
1

我建议使用代理键并使用自然键创建唯一索引。

于 2013-03-13T20:40:13.837 回答
0

如果你的数据库中的这个表直接被另一个表引用,那么不会。如果没有其余的结构,我不完全确定。因此,我将通过一个示例提供一般的经验法则:

客户表:

  • ID
  • 姓名
  • 最后的

但是你不会查询一个单独的地址,而不是将它链接到一个人。所以你有第二个表,叫做Address

  • 客户ID
  • 街道
  • 城市
  • 压缩
  • 状态

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

如果该特定数据始终与另一个表相关联,您只需定义一个Foreign Key. 显然,您的实施和对数据库的访问可能会产生影响。所以你必须保持警惕。如果您使用不同的技术,例如:

  • 实体框架
  • 阿多
  • ETC

因此,请注意数据库和应用程序的实现和设计。

但是,如果没有 a,Primary Key您将不得不定义Indexes,以便您可以优化您的数据库。一如既往。 Primary Key_Indexed

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

抱歉,如果我误解了您的问题,但希望这可以为您指明正确的位置。

于 2013-03-13T20:34:17.767 回答