【发布时间】:2021-02-24 15:07:36
【问题描述】:
我有任务在某些项目中执行某些任务,并且同一项目的相同任务可以在不同的时期完成(每 1 天、2 天……等)。另外这个任务需要一些材料,这取决于任务,但有些任务在某些时期不需要材料,在另一些情况下它需要。
所以我的第一个想法是拥有这张桌子:
TaskOfItemsOnPeriodWithMaterials
{
IDItem;
IDTask;
IDPeriod;
IDMaterial;
AMountOfMaterial;
}
在这种情况下,主键是IDTiem, IDTask, IDPeriod, IDMaterial。
但是如果IDMaterial是key的一部分,它不能为null,所以我不能在没有材料的一个时期内有任务,因为它是需要的。
所以我认为如果IDMaterial 必须是主键,因为实际上它是唯一值的条件,也许我需要另一个表,类似这样:
TaskOfItemsOnPeriod
{
IDItem;
IDTask;
IDPeriod;
}
所以我不得不维护两个表。
但我想知道是否会有更好的解决方案。
谢谢。
【问题讨论】:
-
表格有列,而不是字段。 (日期有年份字段、月份字段和日期字段。)
-
"在这种情况下,主键是 IDTiem、IDTask、IDPeriod、IDMaterial。"一张表可能只有一个主键。您是说要连接字段中的值以在新字段中创建主键,还是要决定将其中哪些用作主键?如果我理解正确,您可能想要创建一个连接 IDTask 和 IDItem 的主键,因为它看起来是非唯一的并且材料可以为空。这将允许您只有一个表,尽管添加了另一个字段(列)。
-
对,我的意思是我在考虑一个主键,即四列,IDItem、IDTask、IDPeriod 和 IDMaterial。我将 IDPeriod 视为主键的一部分,因为一个项目的任务可以分为多个时期,并且每个时期可能需要不同的材料。这就是为什么一开始我认为四列必须是主键的一部分。
-
@Greg 一个表可以有多个列作为主键,一个composite key。
-
任务需要物品和材料吗?还是任务需要物品/材料对?例如,一项任务是否需要每天 5 只羊、10 根羊毛、剪毛机和周末的锯木厂?或者一个任务每天需要 5 只羊用剪毛机,再加上 10 只羊毛在周末用锯木厂?
标签: sql database-design