数据库表设计 - 主键

时间:2013-05-07 06:54:20

标签: database-design

我有一个与数据库设计有关的问题。非常感谢您的意见和建议。

我们设计了一个时间表,用于跟踪员工在各种项目上花费的时间。我们已将时间表数据拆分为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个选项。

选项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表的主键。

还有更好的选择吗?

1 个答案:

答案 0 :(得分:-2)

如果你想让学术界成为第一个普通形式的数据库,那么选项2是好的,但在现实生活中,选项1更好。

在现实生活中,您的应用程序未在这两个表中结束。您将需要链接数据库记录与其他应用程序部分(故障单视图,操作等)在这种情况下使用字段主键(可能是数字或GUID或其他)更好。