複合主キーを代理キー(サロゲートキー)に変えると、外部キー制約が弱くなる時がある

外部キー制約が弱くなるってなんやって話しですが、分かりやすいように例を交えて

取引先と取引先組織が親子関係、注文には2つの組織(請求先組織, 出荷先組織)を持つとした場合に、

取引先組織を複合主キーのまま定義するとこんな感じ。

create table [取引先] (
  [取引先Id] bigint not null primary key,
  [名称] nvarchar(100) not null
)
create table [取引先組織] (
  [取引先Id] bigint not null foreign key references [取引先] ([取引先Id]),
  [連番] bigint not null,
  [名称] nvarchar(100) not null,
  [住所] nvarchar(300) not null
  primary key ([取引先Id], [連番])
)
create table [注文] (
  [注文Id] bigint not null primary key,
  [取引先Id] bigint not null foreign key references [取引先] ([取引先Id]),
  [請求先組織連番] bigint not null,
  [出荷先組織連番] bigint not null,
  foreign key ([取引先Id], [請求先組織連番]) references [取引先組織] ([取引先Id], [連番]),
  foreign key ([取引先Id], [出荷先組織連番]) references [取引先組織] ([取引先Id], [連番])
)

これを複合主キーをやめて代理キーにするとこんな感じ。

create table [取引先] (
  [取引先Id] bigint not null primary key,
  [名称] nvarchar(100) not null
)
create table [取引先組織_サロゲートキー] (
  [取引先組織Id] bigint not null primary key,
  [取引先Id] bigint not null foreign key references [取引先] ([取引先Id]),
  [名称] nvarchar(100) not null,
  [住所] nvarchar(300) not null
)
create table [注文_サロゲートキー] (
  [注文Id] bigint not null primary key,
  [取引先Id] bigint not null foreign key references [取引先] ([取引先Id]),
  [請求先組織Id] bigint not null foreign key references [取引先組織_サロゲートキー] ([取引先組織Id]),
  [出荷先組織Id] bigint not null foreign key references [取引先組織_サロゲートキー] ([取引先組織Id])
)

一見代理キーの方がスッキリして見えるんだけど、注文の2組織が、「取引先に属している組織」かどうかが DB の制約で担保出来なくなってる。
複合主キーの場合は、外部キー制約の中に 取引先Id を含んでいるので、2組織とも取引先に属している組織って担保出来てる。

複合主キーだと in 句で指定出来ないとかデメリットもあるけど、制約で整合性を担保出来る範囲が広くなるケースもあるのでケースバイケースなんすかねー。