Часть 1.
Если верно следующее:
each Cow must be in exactly one Herd
a Herd must have a sacredCow and a herdLeader
a sacredCow for a Herd must be a Cow in that Herd
a herdLeader for a Herd must be a different Cow in that Herd
Тогда вы могли бы реализовать эти правила с этой частичной моделью:
Cow (cowID, herdID) (all mandatory columns)
- primary key (cowID)
- unique (herdID, cowID)
- foreign key (herdID) references Herd (herdID)
Herd (herdID, sacredCow, herdLeader) (all mandatory columns)
- primary key (herdID)
- foreign key (herdID, sacredCow) references Cow (herdID, cowID)
- foreign key (herdID, herdLeader) references Cow (herdID, cowID)
- constraint (sacredCow != herdLeader)
Обратите внимание, что отношения FK включают в себя идентификатор herdID, а не только cowID. Это гарантирует, что только те коровы в стаде могут стать священным коровником или лидером для этого стада.
Этот дизайн делает вещи немного сложными для реализации, но не невозможными. Внешние ключи в Стаде должны быть отложены в базе данных, такой как Oracle, поскольку нам нужно иметь возможность вставлять строки для Стада, прежде чем мы сможем вставить строки для Коров, а для Стада требуется по крайней мере две Коровы ( sacredCow и thedLeader).
Часть 2.
Следующая задача - реализовать следующее ограничение:
only a Sacred Cow may be featured in a Cartoon
Одним из способов сделать это может быть разделение коров на два отдельных отношения: SacredCows и NonSacredCows.
SacredCow (sacredCowID, herdID) (all mandatory columns)
- primary key (sacredCowID)
- unique (herdID, sacredCowID)
- foreign key (herdID) references Herd (herdID)
NonSacredCow (nonSacredCowID, herdID) (all mandatory columns)
- primary key (nonSacredCowID)
- unique (herdID, nonSacredCowID)
- foreign key (herdID) references Herd (herdID)
Herd (herdID, sacredCow, herdLeader)
- primary key (herdID)
- foreign key (herdID, sacredCow) references SacredCow (herdID, sacredCowID)
- foreign key (herdID, herdLeader) references NonSacredCow (herdID, nonSacredCowID)
Cartoon (cartoonID, featuredCow) (all mandatory columns)
- primary key (cartoonID)
- forign key (featuredID) references SacredCow (sacredCowID)
(В этой схеме ограничение (sacredCow! = HerdLeader) больше не требуется, поскольку теперь они по определению являются разными коровами.)