我有一个与数据库设计有关的问题。您的意见/建议将不胜感激。
我们设计了一个时间表,用于跟踪员工在各种项目上花费的时间。我们已将时间表数据拆分为 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 表的主键。现在,TIMESHEET 表的 PRIMARY KEY 有 2 个选项。
选项1
选择一个自动生成的 PRIMARY KEY。我们目前选择了这种方法。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 表的 PRIMARY KEY。
有没有更好的选择?