我有一个与数据库设计有关的问题。非常感谢您的意见和建议。
我们设计了一个时间表,用于跟踪员工在各种项目上花费的时间。我们已将时间表数据拆分为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表每周为每位员工提供一个条目,状态为“打开”,“待批准”,“已批准”,“已拒绝”等.TIMESHEET_DETAIL将详细说明该周内每个活动以及每个活动花费的时间。那些活动。
我的问题是关于TIMESHEET表的PRIMARY KEY和TIMESHEET_DETAIL表。目前,TIMESHEET表的PRIMARY KEY有2个选项。
选择自动生成的PRIMARY KEY。我们目前选择了这种方法。 TIMESHEET_ID是自动生成的INT类型PRIMARY KEY。
我们不需要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表的主键。
还有更好的选择吗?
答案 0 :(得分:-2)
如果你想让学术界成为第一个普通形式的数据库,那么选项2是好的,但在现实生活中,选项1更好。
在现实生活中,您的应用程序未在这两个表中结束。您将需要链接数据库记录与其他应用程序部分(故障单视图,操作等)在这种情况下使用字段主键(可能是数字或GUID或其他)更好。