日期时间字段上的SQL Server主键

时间:2010-03-06 03:57:58

标签: sql-server-2005 database-design data-modeling

我在SQL Server 2005中创建一个需要2个字段的新表:DateTime和MyValue(Int32)。 DateTime字段将是唯一的,因此我将在其上设置唯一约束。

哪种表结构更好,为什么?

MyIndex(PK,int)
MyDate(日期时间)(IX_UniqueKey)
MyValue(int)

MyDate(PK,datetime)
MyValue(int)

我的感觉是我不想在这个表中使用人工PK(MyIndex),因为它是不必要的,因为日期将是唯一的,我将使用它们来访问任何记录。然而,拥有一个人工PK可能会更高效......?

4 个答案:

答案 0 :(得分:10)

当你说日期是唯一的时,你的意思是认为它们将是独一无二的,或者它们的独特性是由问题陈述保证的吗?根据我的经验,有些事情变得不那么独特(例如美国社会保障号码)。

如果日期值不能保证唯一,则应添加整数键。

如果日期值保证唯一,那么它们会改变吗?如果他们确实改变了,他们是否被其他表引用?如果两个答案都是“是”,则可能应该添加整数键。

如果日期值保证唯一,并且未更改或未引用,则可以将它们用作密钥。常规DATETIME是8个字节,标准INTEGER值是4个字节,这可能对索引产生轻微影响。如果您的日期值只是日期,或者只是精确到分钟或更少,并且在类型允许的更受限制的范围内,您可以使用SMALLDATETIME并将这些索引值减少到4个字节。

答案 1 :(得分:2)

如果DATETIME值将由数据库IE填充:

INSERT INTO your_table
  (mydate, myvalue)
VALUES
  (GETDATE(), 1234)

...然后是,将mydate列作为主键是理想的解决方案。如果日期由应用程序IE提供:

INSERT INTO your_table
  (mydate, myvalue)
VALUES
  (@my_date_value, 1234)

...假设数据库没有提供@my_date_value - 不,不理想。根据插入情况,无法保证数据库以外的任何日期时间都是准确的。

答案 2 :(得分:1)

不,你的直觉是正确的。鉴于数据收集过程的可用解决方案,只要没有人可以同时处理两个(或者我想更多)同时发生的事件,你就会很笨拙。

答案 3 :(得分:1)

如果您保证日期时间始终是唯一的(考虑时间组件的解析),那么在日期时间列上创建主键是一个不错的选择。

如果您只是要插入增加的日期时间,那么在主键列上创建聚簇索引也是一个不错的选择。