这应该没有问题,这个想法只是为了确保某种类型的任务只允许与该类型关联的属性。
| 任务类型TYPE_ID 存在。
任务类型由TYPE_ID标识。
任务类型 {TYPE_ID}
PK {TYPE_ID}
| 属性 PROP_ID 存在。
属性由PROP_ID 标识。
属性 {PROP_ID}
PK {PROP_ID}
| 任务类型 TYPE_ID 与属性 PROP_ID 相关联。
对于每个属性,一个任务类型可能与多个属性相关联
可能有多个任务类型与该属性相关联。
如果任务类型与属性相关联,则该任务类型必须存在。
如果任务类型与属性相关联,则该属性必须存在。
任务类型属性 {TYPE_ID, PROP_ID}
PK {TYPE_ID,PROP_ID}
FK1 {TYPE_ID} 参考任务类型 {TYPE_ID}
FK2 {PROP_ID} REFERENCES 属性 {PROP_ID}
| 任务 TASK_ID 属于任务类型 TYPE_ID。
每个任务都属于一种任务类型;对于每个任务类型,可能会有更多
不止一项任务属于该任务类型。
如果任务属于任务类型,则该任务类型必须存在。
任务 {TASK_ID, TYPE_ID}
PK {TASK_ID}
AK {TASK_ID, TYPE_ID} -- 超级键,这里是多余的,但在 SQL 中是必需的
-- 被 FK 引用
FK1 {TYPE_ID} 参考任务类型 {TYPE_ID}
| 类型为 TYPE_ID 的任务 TASK_ID 具有属性 PROP_ID。
一个任务可能具有多个属性,对于每个属性,多个任务都可能具有该属性。
如果任务类型的任务具有属性,则该属性与该任务类型相关联。
如果任务具有与任务类型相关联的属性,则该任务属于该任务类型。
任务属性 {TASK_ID、PROP_ID、TYPE_ID}
PK {TASK_ID,PROP_ID}
FK1 {TASK_ID, TYPE_ID} 参考任务 {TASK_ID, TYPE_ID}
FK2 {TYPE_ID, PROP_ID} REFERENCES TaskTypeProperty {TYPE_ID, PROP_ID}
注意事项:
PK = 主键
AK = 备用键(唯一)
FK = 外键