【发布时间】:2013-05-07 06:54:20
【问题描述】:
我有一个与数据库设计相关的问题。您的意见/建议将不胜感激。
我们设计了一个时间表,用于跟踪员工在各种项目上花费的时间。我们已将时间表数据拆分为 2 个表 => 时间表和时间表详细信息。时间表表的表结构是:
CREATE TABLE [dbo].[TIMESHEET](
[TIMESHEET_ID] [int] IDENTITY(1,1) NOT NULL,
[EMPLOYEE_ID] [varchar](25) NOT NULL,
[WEEK_START_DATE] [datetime] NOT NULL,
[WEEK_END_DATE] [datetime] NOT NULL,
[TIMESHEET_STATUS] [varchar](25) NOT NULL,
[REMARKS] [varchar](250) NULL
)
CREATE TABLE [dbo].[TIMESHEET_DETAIL](
[TIMESHEET_ID] [int] NOT NULL,
[DATE] [datetime] NOT NULL,
[PROJECT_ID] [varchar](25) NOT NULL,
[TASK_ID] [varchar](25) NOT NULL,
[TIME_IN] [datetime] NULL,
[TIME_OUT] [datetime] NULL,
[HOURS] [real] NOT NULL,
[REMARKS] [varchar](250) NULL
)
只是对表格的简要说明。
TIMESHEET 表示例条目如下所示:
TIMESHEET_ID EMPLOYEE_ID WEEK_START_DATE WEEK_END_DATE TIMESHEET_STATUS REMARKS
1 EMP102 4/28/2013 5/4/2013 Open NULL
2 EMP001 4/28/2013 5/4/2013 Open NULL
TIMESHEET_DETAIL 表示例条目如下所示:
TIMESHEET_ID DATE PROJECT_ID TASK_ID START_TIME END_TIME NUM_HOURS REMARKS
2 5/2/2013 PRJ45 TASKA01 NULL NULL 3.2 NULL
2 5/4/2013 PRJ45 TASKA01 NULL NULL 2.2 NULL
2 5/4/2013 PRJ45 TASKB01 NULL NULL 1.6 NULL
2 5/4/2013 PRJ45 TASKE01 NULL NULL 1 NULL
1 5/3/2013 PRJ45 TASKA01 NULL NULL 2.5 NULL
1 5/3/2013 PRJ45 TASKB01 NULL NULL 0.5 NULL
1 5/4/2013 PRJ45 TASKA01 NULL NULL 1.5 NULL
1 5/4/2013 PRJ45 TASKB01 NULL NULL 0.5 NULL
1 5/4/2013 PRJ45 TASKC01 NULL NULL 2.5 NULL
1 5/4/2013 PRJ45 TASKD01 NULL NULL 3 NULL
TIMESHEET 表是父表,TIMESHEET_DETAIL 表是子表。 TIMESHEET 表中每个员工每周都会有一个条目,状态将为 Open、Pending for Approval、Approved、Rejected 等。TIMESHEET_DETAIL 将包含有关该周内花费的每项活动的详细信息以及每个活动花费的小时数这些活动。
我的问题是关于 TIMESHEET 表和 TIMESHEET_DETAIL 表的 PRIMARY KEY。目前,TIMESHEET 表的 PRIMARY KEY 有 2 个选项。
选项 1
选择一个自动生成的主键。我们目前选择了这种方法。 TIMESHEET_ID 是自动生成的 INT 类型 PRIMARY KEY。
选项 2
我们不需要 TIMESHEET_ID。 EMPLOYEE_ID 连同 WEEK_START_DATE 和 WEEK_END_DATE 可以唯一标识 TIMESHEET 表中的任何行。但我觉得它不符合简单的标准。
哪个选项更适合 TIMESHEET 表,为什么?
对于 TIMESHEET_DETAIL 表,复合 PRIMARY KEY 当前包括
( TIMESHEET_ID, DATE, PROJECT_ID, TASK_ID )。如果我们在 TIMESHEET 表中没有自动生成的 PRIMARY KEY,那么我们将只有 ( DATE, PROJECT_ID, TASK_ID ) 作为
TIMESHEET_DETAIL 表的主键。
有没有更好的选择?
【问题讨论】:
-
我看不出你如何能够在没有
TIMESHEET_ID的情况下将TIMESHEET_DETAIL的条目加入TIMESHEET的条目。我认为这是必需的,但我可能错了。由于TIMESHEET_ID、WEEK_START_DATE和WEEK_END_DATE都在表1 中,您使用什么标准来创建连接?您必须使用上述三个列的组合索引...
标签: database-design