没有主键或代理键?

时间:2011-11-23 14:25:53

标签: database-design sql-server-2008-r2

我即将创建一个包含客户ID(GUID),数据点(字符串)和输入时间的表。但是,我无法弄清楚如何最好地键入它。我无法保证3元组的ID /字符串/时间是唯一的(该表将包含用户输入,我们预见到某些用户会尝试编写表单提交,因此时间可能没有足够的分辨率。)

我们会经常在此表中进行查找,因此查询速度非常重要。另一方面,插入物也不能完全削弱。

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

我们正在使用SQL Server 2008 R2。

2 个答案:

答案 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来执行此操作。

虽然您可以在表上没有,一个或多个唯一约束,但您只能拥有一个主键,因此请将其用作代理主键,并避免出现许多其他问题。