Database design 数据库表设计-主键

Database design 数据库表设计-主键,database-design,Database Design,我有一个关于数据库设计的问题。我们将非常感谢您的意见/建议 我们设计了一个时间表,跟踪员工在各种项目上花费的时间。我们已将时间表数据拆分为两个表=>Timesheet&Timesheet Detail。时间表表的表结构为: CREATE TABLE [dbo].[TIMESHEET]( [TIMESHEET_ID] [int] IDENTITY(1,1) NOT NULL, [EMPLOYEE_ID] [varchar](25) NOT NULL, [WEEK_START

我有一个关于数据库设计的问题。我们将非常感谢您的意见/建议

我们设计了一个时间表,跟踪员工在各种项目上花费的时间。我们已将时间表数据拆分为两个表=>Timesheet&Timesheet Detail。时间表表的表结构为:

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_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_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_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_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
时间表表是父表,时间表详细信息表是子表。 时间表表每周为每个员工提供一个条目,状态为“打开”、“待批准”、“已批准”、“已拒绝”等。时间表详细信息将包含该周内每项活动的详细信息以及每项活动的小时数

我的问题是关于时间表表和时间表详细信息表的主键。现在,时间表表的主键有两个选项

选择1 选择自动生成的主键。我们目前选择了这种方法。时间表ID是自动生成的INT类型主键

选择2 我们不需要时间表ID。员工ID以及周开始日期和周结束日期可以唯一标识时间表表中的任何行。但我觉得它不符合简单的标准

对于时间表表,哪个选项更好?为什么

对于时间表_详细信息表,复合主键当前包含
(时间表ID、日期、项目ID、任务ID)
。如果我们在时间表表中没有自动生成的主键,那么我们将只使用
(日期、项目ID、任务ID)
作为 时间表详细信息表的主键


有更好的选择吗?

如果您想创建学术右首标准表单数据库,那么选项2很好,但在现实生活中,选项1更好


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

我看不出在没有
时间表ID
的情况下,如何将
时间表详细信息的条目连接到
时间表的条目。我认为这是必须的,但我可能错了。由于
TIMESHEET\u ID
WEEK\u START\u DATE
WEEK\u END\u DATE
都在表1中,您使用什么标准创建联接?您必须使用上述三列的组合索引……关于堆栈溢出,已经有10亿个问题在讨论这个问题了。