数据库设计首选项:在SQL 2000中使用DateTime和BIT

Jon*_*Jon 2 t-sql database-design sql-server-2000

我需要通过例子来解释这个:

是否有在数据库表中指定DateTime和BIT的最佳实践或首选项?

在我的数据库中,我有一个Widget表.我需要知道一个小部件是否"已关闭"并且它是"关闭日期"业务规则说如果一个小部件关闭,它必须有一个关闭日期.如果窗口小部件未关闭,则不应具有"关闭日期".

为了设计这个,我可以做到以下几点:

(例1):

CREATE TABLE [Widget]
(
    [WidgetID] INT IDENTITY(1,1)
    ,[ClosedDate] DATETIME NULL
)
Run Code Online (Sandbox Code Playgroud)

或(例2):

CREATE TABLE [Widget]
(
    [WidgetID] INT IDENTITY(1,1)
    ,[IsClosed] BIT NOT NULL CONSTRAINT [DF_Widget_IsClosed] DEFAULT (0)
    ,[ClosedDate] DATETIME NULL
)
Run Code Online (Sandbox Code Playgroud)

我认为示例1更清晰,因为它不用担心会减少一个列.但是,每当我需要评估Widget是否已关闭时,我需要一个额外的步骤来确定ClosedDate列是否为非NULL.

示例2创建了额外的开销,因为现在我必须保持IsClosed和ClosedDate值同步.

在设计这样的东西时有最好的做法吗?对于示例2,查询表格会更有效吗?我有什么理由选择一种设计而不是另一种设计?

注意:我将通过ORM工具和存储过程访问此值.

Max*_*eat 5

我认为选项1更好.数据完整性得到了更好的保存(不可能有一个带有反向标记的关闭日期),在超大表的情况下占用更少的磁盘空间,并且对于队友来说查询仍然是高效且清晰的.