场景是时间卡。员工在 TimeCardHeader 表上打卡和打卡,但在 TimeCardDetail 表中输入 Details。但是,他们可以输入至少两种不同的详细信息……这是我的问题。我是创建两个代表每种类型的表格,还是一个带有解释表格含义的布尔标志的表格?
以下是字段(这个例子很小,其他的有很多字段):
Id (PK)
Version
StartTime
EndTime
LaborDetailDescription
LaborType: Can be direct or indirect.
如果 LaborType 是 Indirect,则其余字段如下:
IndirectNumber (FK)
如果 LaborType 为 Direct,则其余字段如下:
JobNumber (FK)
JobType
DirectType: Can be Production or Setup
如果 DirectType 是 Production,则其余字段如下:
GoodQty
ScrapQty
如果 DirectType 是 Setup,则其余字段如下:
SetupPercent
所以...我是创建一个包含所有这些字段的表,但是当设置类型时,某些字段是空白的(这意味着代码、报告、查询等需要解释数据库),还是我创建两个表 DirectLaborDetail 和 IndirectLaborDetail 并将数据整齐地存储到适当的表中?在这种情况下,甚至 DirectLabor 也被分解为 DirectLaborSetup 和 DirectLaborProduction。
我从多个方面提出这个问题:
- 根据数据库设计原则的理论纯度。
- 性能问题。
- 查询创建困难(这也包括针对它的编码)。
- 我可能未在此处列出的任何其他考虑因素。
编辑:添加了更多细节......
选项1
/*I intentionally left out the type information*/
CREATE TABLE TimeCardDetail
(
Id,
Version,
TimeCardHeaderId, /*Not depicted here, FK*/
StartTime,
EndTime,
LaborDetailDescription,
LaborType, /*FK*/
IndirectId, /*FK*/
JobId, /*FK*/
DirectType, /*FK*/
GoodQty,
ScrapQty,
SetupPercent
);
选项 2
CREATE TABLE TimeCardDetail
(
Id,
Version,
StartTime,
EndTime,
LaborDetailDescription
);
CREATE TABLE DirectLaborDetail
(
Id,
Version,
TimeCardHeaderId, /*Not depicted here, FK*/
JobId, /*FK*/
DirectType, /*FK*/
GoodQty,
ScrapQty,
SetupPercent,
TimeCardDetailId /*FK*/
);
CREATE TABLE IndirectLaborDetail
(
Id,
Version,
TimeCardHeaderId, /*Not depicted here, FK*/
IndirectId, /*FK*/
TimeCardDetailId, /*FK*/
);
作为一个人,我更喜欢这个,因为我可以清楚地看到数据的商业意义,同时,一切都在它的位置上,不需要解释。查询变得更有趣了,因为如果我想查看特定 TimeCardHeader 的所有详细信息,我需要查看两个表。但这真的是当今计算能力的问题吗?
选项 3
与选项 2 一样,只是我们颠倒了关系......
CREATE TABLE TimeCardDetail
(
Id,
Version,
TimeCardHeaderId, /*Not depicted here, FK*/
StartTime,
EndTime,
Description,
LaborType, /*FK*/
FKId, /*would link to the DirectLabordetail or IndirectLaborDetail depending on LaborType*/
);
我没有这个选项,因为 FKId 的含义取决于 LaborType。