繁体   English   中英

没有主键或代理键?

[英]No primary key, or surrogate key?

我将要创建一个表,其中将包含客户ID(GUID),数据点(字符串)和输入时间。 但是,我不知道如何最好地将其锁定。 我不能保证三元组ID /字符串/时间是唯一的(表将包含用户输入,并且我们预见到某些用户将尝试编写表单提交的脚本,因此时间可能没有足够的分辨率)。

我们将经常在此表中进行查找,因此查询速度很重要。 另一方面,刀片也不能完全残缺。

因此,我看到两个选择:要么不使用主键,要么定义代理自动增量键。 鉴于上述要求,最好的方法是什么? 我可以对三个数据列使用代理键和非唯一索引吗?

我们正在使用SQL Server 2008 R2。

那么具有这样的行的表是什么意思呢?

customer_id                           data_point     time_entered
--
6F9619FF-8B86-D011-B42D-00C04FC964FF  some data      2011-11-23 10:02:12.34567
6F9619FF-8B86-D011-B42D-00C04FC964FF  some data      2011-11-23 10:02:12.34567
6F9619FF-8B86-D011-B42D-00C04FC964FF  some data      2011-11-23 10:02:12.34567

这是一个什么都有这样行的表呢?

id  customer_id                           data_point     time_entered
--
1   6F9619FF-8B86-D011-B42D-00C04FC964FF  some data      2011-11-23 10:02:12.34567
2   6F9619FF-8B86-D011-B42D-00C04FC964FF  some data      2011-11-23 10:02:12.34567
3   6F9619FF-8B86-D011-B42D-00C04FC964FF  some data      2011-11-23 10:02:12.34567

如果您在第一个问题上没有一个好的答案,然后在该表上悬挂一个ID号,则以后也将没有好的答案。

除非您有充分的理由,否则默认情况下,数据库设计将使用具有IDENTITY属性设置的smallint / int / bigint的代理主键,以使其自动生成主键值。 如果以后决定要使用表中的一个或多个列来强制使用自然键,则可以通过创建UNIQUE CONSTRAINT来实现。

尽管在一个表上可以没有,只有一个或多个唯一约束,但是您只能有一个主键,因此可以将其用作代理主键,这样可以避免很多其他问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM