2013-03-13 64 views
4

我有一个叫做“日期限制”表,它基本上拥有以下特性:如果表格无意义,我应该使用主键ID吗?

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

现在我将访问这个办法是得到我想要的事件,然后看看相关的日期限制。

如果我不需要单独引用日期限制,是不是很好的做法或建议将主键列添加到此表中?

+0

为什么(EventId,DateFrom)或(EventId,DateFrom,DateTo)中的一个不是该表的自然PK。你真的想允许重复吗? – 2013-03-13 20:30:50

+3

我相信你无论如何都需要PK,否则你最终会有重复。问题是你想要自然的还是合成的。你正在计划管理该表更新,删除它的记录,对吧?如果是这样的话,那么合成PK是一个很好且一致的方式来针对特定的行,特别是如果你的应用程序(客户端代码)ID用于其他实体(表)的整个地方。 – peterm 2013-03-13 20:34:45

回答

5

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

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

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

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;} 
} 
0

如果您的数据库中的这张表直接引用另一个表,那么没有。没有你的结构的其余部分,我不完全确定。所以,我会提供一个一般的经验法则用一个例子:

客户表:

  • 编号
  • 名称
  • 最后

但你不会查询一个个人地址,而不是没有将其链接到一个人。所以你有第二个表叫地址

  • 客户编号
  • 邮编
  • 国家

所以这一个客户将永远有一个绑地址,所以定义Foreign Key是可以接受的。现在,如果一个客户被允许有多于一个地址那么是的,你需要一个Primary Key,所以这个结构是独立的。

如果该特定数据总是绑定到另一个表,则可以定义Foreign Key。很明显,您的实施和访问数据库可能会产生影响。所以你必须保持警惕。如果您使用不同的技术,如:

  • 实体框架
  • 阿土

因此意识到实现两者的数据库和应用程序的设计。

但是,如果没有Primary Key,您必须定义Indexes,以便您可以优化数据库。由于Primary Key总是Indexed

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

对不起,如果我误解了你的问题,但希望这会指出你在正确的位置。

4

作为一个数据库设计实践,总是建议使用主键。即使您的应用程序没有直接引用DateRestriction表,对于一行有一个唯一标识,不仅可以在SQL方面获益,还可以让实体框架轻松映射表(不经过任何额外的箍环)。

1

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

相关问题