メンテナンスアイテム間に多対多の関係が必要な場合は、連想エンティティを使用する唯一の理由は示唆していることです。それがあなたの後ろであれば、オプション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) ,
)
これは、関連するすべてのメンテナンス項目は、同じプログラムコードを共有していることを確認し、メンテナンス項目が自身に(チェック制約)をマッピングすることができないというようなもののようになります。
しかし、あなたの問題ステートメントは、親子関係を参照しています。これは、階層/ツリーのように聞こえます。この場合は、あなたが望むのスキーマは次のようになります:
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つの親メンテナンス項目があり、これは同じメンテナンスプログラムに関連している必要があります。
チェック制約は、特定のメンテナンス項目がそれ自身の親ではない可能性があることを示します。
あなたのトップスキーマは、私が後にしたものです。多対多の関係にする必要があります。ありがとうございました! – Reafidy