私のテーブルスキーマは次のようなものです
1.マスターテーブル:条項
列
- ClauseID =サロゲートpk(ID)
- ClauseCode=nvarcharユーザー指定値
- Class =nvarcharFKからマスタークラステーブルへ
- 等...
ClauseCode +Class=このテーブルの候補キー
2.マスターテーブル:GroupClause
列
- GroupClauseID =サロゲートpk(ID)
- GroupClauseCode=nvarcharユーザー指定値
- Class =nvarcharFKからマスタークラステーブルなどへ。
GroupClauseCode +Class=このテーブルの候補キー
3.トランザクション/マッピングテーブル::GroupClause_Clause_Mapping:このテーブルは、各グループ句を複数の個別の句にマッピングします
列
- GroupClauseID=FKからGroupClausePK
- ClauseID=FKからClausePK
- 等...
要件:各Group句は、それ自体と同じクラスに属する句にのみマップできます。
問題:上記のテーブルデザインは、DBレベルでその要件を強制しません。
考えられる解決策の1つ:テーブル*GroupClause_Clause_Mapping*には列があります
- ClauseCode
- GroupClauseCode
- クラス
ここで、ClauseCode + Class as FKtoclauseテーブルとGroupClauseCode+Class as FKtoGroupClauseテーブルを作成できます。
ただし、この方法で行うと、代理IDキーは役に立たなくなり、それらを削除した方がよい場合があります。
代理キーを使用したデザインに問題はありますか?
代理キーを使用し、DBレベルで制約を適用する方法に関する提案はありますか?