1

我有一个与数据库设计有关的问题。您的意见/建议将不胜感激。

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

有没有更好的选择?

4

1 回答 1

-2

如果您想建立学术权利的第一个范式数据库,选项 2 很好,但在现实生活中,选项 1 更好。

在现实生活中,您的应用程序并没有在这两个表中结束。您需要将数据库记录与其他应用程序部分(票证视图、操作等)链接起来,在这种情况下,在字段主键(可能是数字或 GUID 或花药)上使用会更好。

于 2013-05-07T07:17:40.087 回答