使用您所建议的关联实体的唯一原因是您是否希望维护项目之间存在多对多关系。如果这就是你所追求的,那么选项 1 就是你要做的。架构看起来像
create table MaintenanceProgram
(
ProgramCode int not null ,
... -- other non-key attributes here
primary key ( ProgramCode ) ,
)
create table MaintenanceItem
(
ProgramCode int not null ,
MaintenanceCode int not null ,
... -- other non-key attributes here
primary key ( ProgramCode , MaintenanceCode ) ,
foreign key ( ProgramCode )
references MaintenanceProgram ( ProgramCode ) ,
)
create table MaintenanceItemMap
(
ProgramCode int not null ,
ParentMaintenanceCode int not null ,
ChildMaintenanceCode int not null ,
primary key ( ProgramCode , ParentMaintenanceCode , ChildMaintenanceCode ) ,
foreign key ( ProgramCode , ParentMaintenanceCode )
references MaintenanceItem ( ProgramCode , MaintenanceCode ) ,
foreign key ( ProgramCode , ChildMaintenanceCode )
references MaintenanceItem ( ProgramCode , MaintenanceCode ) ,
check ( ParentMaintenanceCode != ChildMaintenanceCode ) ,
)
这确保所有相关的维护项目共享相同的 ProgramCode,并且维护项目不能映射到自身(检查约束)。
但是,您的问题陈述是指父/子关系,这听起来更像是层次结构/树。在这种情况下,您想要的架构如下所示:
create table MaintenanceProgram
(
ProgramCode int not null ,
... -- other non-key attributes here
primary key ( ProgramCode ) ,
)
create table MaintenanceItem
(
ProgramCode int not null ,
MaintenanceCode int not null ,
ParentMaintenanceCode int null ,
... -- other non-key attributes here
primary key ( ProgramCode , MaintenanceCode ) ,
foreign key ( ProgramCode )
references MaintenanceProgram ( ProgramCode ) ,
foreign key ( ProgramCode , ParentMaintenanceCode )
references MaintenanceItem ( ProgramCode , MaintenanceCode ) ,
check ( MaintenanceCode != ParentMaintenanceCode or ParentMaintenanceCode is null ) ,
)
上面说每个维护项目都与一个维护程序相关;相反,每个维护程序都有零个或多个维护项目。
进一步,每个维护项目有零个或1个父维护项目,必须与同一个维护程序相关。
检查约束表示给定的维护项目可能不是它自己的父项。