Sql 此列是否属于主键,并且可以为null?

Sql 此列是否属于主键,并且可以为null?,sql,database-design,Sql,Database Design,我有任务在一些项目中做一些任务,同一项目的同一任务可以在不同的时间段(每1天、2天等)完成。这项任务也需要一些材料,这取决于任务,但有些任务在某些时期不需要材料,另一些情况下则需要材料 所以我的第一个想法是有这个桌子: TaskOfItemsOnPeriodWithMaterials { IDItem; IDTask; IDPeriod; IDMaterial; AMountOfMaterial; } 在这种情况下,主键将是IDTiem、IDTask、I

我有任务在一些项目中做一些任务,同一项目的同一任务可以在不同的时间段(每1天、2天等)完成。这项任务也需要一些材料,这取决于任务,但有些任务在某些时期不需要材料,另一些情况下则需要材料

所以我的第一个想法是有这个桌子:

TaskOfItemsOnPeriodWithMaterials
{
    IDItem;
    IDTask;
    IDPeriod;
    IDMaterial;
    AMountOfMaterial;
}

在这种情况下,主键将是
IDTiem、IDTask、IDPeriod、IDMaterial

但是如果
IDMaterial
是键的一部分,那么它不能为null,因此我不能在一个没有材质的时段中包含任务,因为它是必需的

所以我认为如果
IDMaterial
必须是主键,因为实际上它是唯一值的条件,也许我需要另一个表,类似这样的:

TaskOfItemsOnPeriod
{
    IDItem;
    IDTask;
    IDPeriod;
}
所以我不得不维持两张桌子

但我想知道是否有更好的解决办法


谢谢。

让我们更正式地陈述一下这个问题

  • “某些项目中的某些任务”任务有许多项目,我假设一个项目可以有许多任务:多对多
    • “同一项目的同一任务可以在不同时期完成 (每1天、2天……等)“任务只能在特定时间段内使用该项
  • “我需要一些材料来完成这个[任务]”一个任务有很多数量的材料,一个材料可能有很多任务:多对多
    • 一项任务需要大量的材料
我们的数据表是

  • 任务
  • 项目
  • 材料
这些表格的细节无关紧要。我们关心的是他们有一个主键,比如说他们有一个名字

我们需要两个多对多联接表。一个用于将项目与任务关联,另一个用于将材料与任务关联。这些不是纯粹的联接表,它们有额外的数据

  • 任务项
    • 可以完成的时间段
  • 任务单元材料
    • 任务所需的材料数量
这应该可以做到。要将项目和材料添加到任务中

-- Task 10 needs 5 of material 20 and 3 of material 40.
insert into task_materials (task_id, material_id, quantity) values
  (10, 20, 5),
  (10, 40, 3);

-- Task 10 needs item 5 every 2 days, and item 10 every day.
insert into task_items (task_id, item_id, period) values
  (10, 5, '2 days'),
  (10, 10, '1 day');
select t.name, m.name, tm.quantity
from task_materials tm
join materials on m.material_id = tm.material_id
join tasks on t.task_id = tm.task_id
where tm.task_id = 1234
例如,要查找任务所需的所有材料和数量

-- Task 10 needs 5 of material 20 and 3 of material 40.
insert into task_materials (task_id, material_id, quantity) values
  (10, 20, 5),
  (10, 40, 3);

-- Task 10 needs item 5 every 2 days, and item 10 every day.
insert into task_items (task_id, item_id, period) values
  (10, 5, '2 days'),
  (10, 10, '1 day');
select t.name, m.name, tm.quantity
from task_materials tm
join materials on m.material_id = tm.material_id
join tasks on t.task_id = tm.task_id
where tm.task_id = 1234

表有列,而不是字段。(日期有年字段、月字段和日字段。)“在这种情况下,主键为IDTiem、IDTask、IDPeriod、IDMaterial。”表只能有一个主键。您是说要连接字段中的值以在新字段中创建主键,还是要决定将其中的哪一个用作主键?如果我理解正确,您可能希望创建一个主键,将IDTask与IDItem连接起来,因为句点似乎是非唯一的,并且材质可以为null。这将允许您只拥有一个表,尽管添加了另一个字段(列)。对,我想说的是,我在考虑主键,即四列,IDItem、IDTask、IDPeriod和IDMaterial。我将IDPeriod作为主键的一部分考虑在内,因为intem的taks可以分为多个时期,每个时期可能需要不同的材料。这就是为什么一开始我认为这四列必须是主键的一部分。@Greg表可以有多列作为主键,A。任务是否需要项目和材料?或者任务是否需要项目/物料对?例如,一项任务是否需要5只羊、10只羊毛、每天的换毛机和周末的锯木厂?或者,一项任务每天需要5只羊和牧羊机,周末需要10只羊毛和锯木厂?我想提问者想说的是,在某些时期,任务需要一种材料,而在其他时期,任务不需要这种材料。@NevilleKuyt不清楚。它可能都围绕着时间段?我要求澄清。@NevilleKuyt是righit。我想说的是,在某些时期,同一项任务可能需要不同的材料。@lvaroGarcía我发表了一些评论,要求提供一个可靠的例子。如果你回答他们,我可以再试一下答案。