[英]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.