我即将创建一个包含客户ID(GUID),数据点(字符串)和输入时间的表。但是,我无法弄清楚如何最好地键入它。我无法保证3元组的ID /字符串/时间是唯一的(该表将包含用户输入,我们预见到某些用户会尝试编写表单提交,因此时间可能没有足够的分辨率。)
我们会经常在此表中进行查找,因此查询速度非常重要。另一方面,插入物也不能完全削弱。
所以,我看到两个选择:要么没有主键,要么定义代理自动增量键。鉴于上述要求,最好的是什么?我可以为三个数据列使用代理键和非唯一索引吗?
我们正在使用SQL Server 2008 R2。
答案 0 :(得分:0)
那么具有这样的行的表是什么意思?
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
具有 this 等行的表是什么意思?
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号挂在该表上之前对第一个问题没有一个好的答案,那么您之后就不会得到一个好的答案。
答案 1 :(得分:0)
除非您有充分的理由不这样做,否则默认您的数据库设计使用代理主键,使用smallint / int / bigint,并根据IDENTITY属性设置,以便生成自动创建的主键值。如果您稍后决定要使用表中的一个或多个列强制执行自然键,则可以通过创建UNIQUE CONSTRAINT来执行此操作。
虽然您可以在表上没有,一个或多个唯一约束,但您只能拥有一个主键,因此请将其用作代理主键,并避免出现许多其他问题。