您好我的问题类似于:
MySQL: Using DATETIME as primary key
但是我对Sql Server特别感兴趣,我想在实际上考虑到一个特定的场景,而不是理论上和另一篇文章一样。
我想存储用户执行的事件/操作。多个用户在相同的100ms间隙中执行动作的几率非常低,并且不经常碰撞是可接受的。如果我可以离散地表达10ms甚至1ms的间隙,那么我对风险非常满意。
因此提出问题,我可以使用DateTime作为我的主键而不是唯一标识符,因为我将定期查询最新的100个事件并按发生时间对事件进行排序。
答案 0 :(得分:3)
如果你真的想避免使用代理键(ID / identity列),我至少会将datetime列和用户id列组合成一个复合键。这听起来更适合您的数据。
答案 1 :(得分:2)
是的,你可以,但对我来说这听起来是个糟糕的主意。 如果您真的担心性能,可以使用顺序唯一标识符,自动递增整数,或者可以为DateTime列提供自己的聚簇索引(推荐)。
答案 2 :(得分:0)
为了使不常见的碰撞可以接受,你实际上不能使用时间戳,因为会发生碰撞。
您可以使用稍微修改数据时间的智能过程来编写冲突代码,但是为什么在时间戳上的索引足够并且更容易实现时会感到烦恼。
此article可提供有关C#特有的精度问题的信息。
答案 3 :(得分:0)
在SQL Server 2008中,使用DATETIME2,而不是DATETIME。您可以在SQL Server 2008中实现高达100纳秒的精度。
如果您有时需要在给定时间内记录多行,但不经常,那么我不确定您通过将日期和时间变为键来实现的目标。选择键的重要标准是熟悉,简单和稳定。在此基础上,假设它确实符合您的要求,日期和时间似乎是一个明智的选择。