我在SQL Server 2005中创建一个需要2个字段的新表:DateTime和MyValue(Int32)。 DateTime字段将是唯一的,因此我将在其上设置唯一约束。
哪种表结构更好,为什么?
MyIndex(PK,int)
MyDate(日期时间)(IX_UniqueKey)
MyValue(int)
或
MyDate(PK,datetime)
MyValue(int)
我的感觉是我不想在这个表中使用人工PK(MyIndex),因为它是不必要的,因为日期将是唯一的,我将使用它们来访问任何记录。然而,拥有一个人工PK可能会更高效......?
答案 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)
如果您保证日期时间始终是唯一的(考虑时间组件的解析),那么在日期时间列上创建主键是一个不错的选择。
如果您只是要插入增加的日期时间,那么在主键列上创建聚簇索引也是一个不错的选择。