SQL Bits与Datetimes一起确定记录的逻辑状态

时间:2010-03-10 14:21:18

标签: sql-server-2005 database-design

大家好,我有这个问题在最佳实践方面一再出现。

假设我有下表:

[Process]
----------------
ProcessID int
ProcessName varchar(100)
...

除了上面的字段之外,我们可以说[Process]可以有各种状态。它目前可能成功,目前不成功,或两者都不成功。理论上它可能是两者,但我们不会担心。我们还需要知道该状态最后一次更新。

我的问题是在数据结构中表示这种状态的最佳方法是什么?我可以想到几个可能性:

(1)添加名为State (bit, null)的列,1表示成功,0表示不成功,NULL表示不成功。然后,我们添加一列LastStateChangeDateTime (datetime, null),告诉我们上次更改State位的时间。我从来没有直接回答这种使用是否是一个坏主意。

(2)我们添加了两列名为HasState (bit, not null)CurrentState (bit, not null)以及我们的LastStateChangeDateTime (datetime, null)列。这消除了“三态”的使用,但看起来很笨拙和令人困惑。

(3)我们有两对列IsCurrentlySuccessful (bit, not null)SuccessBeginDateTime (datetime, null)以及IsCurrentlyFailing (bit, not null)FailureBeginDateTime (datetime, null)。这使得这两个州彼此独立。

(4)没有比特,只有日期时间:SuccessBeginDateTime (datetime, null)FailureBeginDateTime (datetime, null)。我们根据日期时间自己来推断状态。我觉得这会导致低效的查询和/或索引。

我知道上面的例子是人为的,但是有没有人有任何关于如何有效处理这个小数据结构问题的好解决方案?请记住,在实践中,这些“状态”不一定是相互排斥的,因此如果数据结构同时允许这两个国家,它就不会是世界末日。

谢谢!

1 个答案:

答案 0 :(得分:1)

我会选择选项4,除非你的牌桌很大,你会担心表现。对我来说,其他选项显示某种程度的“传递依赖”,因此会对数据一致性造成风险。