如何在 M:M 中执行 1:M 关系?

How to enforce a 1:M relation in a M:M?

我正在设计数据库模式。

目前有 2 tables:

  1. 任务(任务 ID、任务名称)
  2. 描述(DescriptionID,描述)

一个任务可以有多个描述,但同一个描述不应该被多个任务共享。描述可以有 0 或 1 个任务(用户应该能够在没有任务的情况下添加描述,并且能够在以后 link 任务)。

选项 1:

在描述中添加 TaskID 作为可为 null 的外键 table。

选项 2

相反,我可以创建另一个名为 TaskDescription(RowID, TaskID, DescriptionID) 的 table。 但现在是 M:M。一个任务可以有多个描述,一个描述可以被多个任务共享。在这种情况下,如何防止超过 1 个任务共享相同的描述?

Option 2

Instead, I can create another table called TaskDescription(RowID, TaskID, DescriptionID). But it is now a M:M. A task can have multiple descriptions, and a description can be shared by multiple tasks. In this case, how to prevent more than 1 task from sharing the same description?

只有两个具有复合主键的列(显然在两个列上)就足以满足另一个table以及唯一索引descriptionID 上执行

but the same description shouldn't be shared by multiple tasks

类似这样的东西(Oracle 语法;忽略那个。我希望通过查看一些代码而不是阅读我的非母语英语描述更容易理解我的意思):

create table taskDescription
  (taskID         number  constraint fk_td_task references task (task_id),
   descriptionID  number  constriant fk_td_desc references description (descriptionID),
  --
  constraint pk_td primary key (taskID, descriptionID)
  );

create unique index ui1_td on taskDescription (descriptionID);

这样做,如果您试图违反任何强制约束,数据库将处理所有事情并引发错误。