Database design 与预定义类型的多对多关系

Database design 与预定义类型的多对多关系,database-design,many-to-many,relationship,entity-relationship,rdbms,Database Design,Many To Many,Relationship,Entity Relationship,Rdbms,每个进程都有多个操作。每个操作都有一个唯一的持续时间(秒),取决于它所属的进程,一个操作可能属于多个进程 问题是我必须使用预定义的“类型”列表,并且每个流程/操作必须属于相同的“类型”。换句话说,“类型a”的进程不能有“类型B”的操作,同样的事情也会发生在另一边 我尝试了以下方法,但没有成功。有什么线索吗 我认为这看起来像是三元关系的经典案例 例如: 教授科目 资料来源: 现在,流程、操作和类型是具有三元关系的三个实体 逻辑模式将具有这种三元关系。它将分解为多个m:n或1:n关系(取决于域约束

每个进程都有多个操作。每个操作都有一个唯一的持续时间(秒),取决于它所属的进程,一个操作可能属于多个进程

问题是我必须使用预定义的“类型”列表,并且每个流程/操作必须属于相同的“类型”。换句话说,“类型a”的进程不能有“类型B”的操作,同样的事情也会发生在另一边

我尝试了以下方法,但没有成功。有什么线索吗


我认为这看起来像是三元关系的经典案例

例如:

教授科目

资料来源:

现在,流程、操作和类型是具有三元关系的三个实体

逻辑模式将具有这种三元关系。它将分解为多个m:n或1:n关系(取决于域约束)。之后,您可以将它们建模为模式中的任何其他m:n

有关更多信息,请参阅

第5.5.1节三元和高阶关系的分解

来自同一本书

此外,您可以看到:



我在这里允许一个操作在过程中重复,不确定这在您的模型中是否有意义——如果不是简单地放弃
process\u operation\u no
并在PK中使用
operation\u id


编辑

type_id
名称保留在所有位置,这样会更好一些;也没有
过程\u操作\u no
——不允许操作在过程中重复

po_type {type_id, type_name}
     PK {type_id}
     AK {type_name}


operation {operation_id, type_id}
       PK {operation_id}
       SK {operation_id, type_id}
       FK {type_id} REFERENCES po_type {type_id}


process {process_id, type_id}
     PK {process_id}
     SK {process_id, type_id}
     FK {type_id} REFERENCES po_type {type_id} 


op_proc {process_id, operation_id, type_id, duration}
     PK {process_id, operation_id}
    FK1 {process_id,   type_id} REFERENCES process   {process_id,   type_id}    
    FK2 {operation_id, type_id} REFERENCES operation {operation_id, type_id}

这正是我所期待的。非常感谢。这将帮助我提高我的理论知识。谢谢
Notes: PK = primary key 
       AK = alternate key (use unique constraint/index)
       SK = superkey      (use unique constraint/index)
       FK = foreign key
po_type {type_id, type_name}
     PK {type_id}
     AK {type_name}


operation {operation_id, type_id}
       PK {operation_id}
       SK {operation_id, type_id}
       FK {type_id} REFERENCES po_type {type_id}


process {process_id, type_id}
     PK {process_id}
     SK {process_id, type_id}
     FK {type_id} REFERENCES po_type {type_id} 


op_proc {process_id, operation_id, type_id, duration}
     PK {process_id, operation_id}
    FK1 {process_id,   type_id} REFERENCES process   {process_id,   type_id}    
    FK2 {operation_id, type_id} REFERENCES operation {operation_id, type_id}