У владельца молочной фермы, который является также частично занятым мультипликатором, есть несколько стад коров. Он присвоил каждую корову конкретному стаду. У каждого стада у фермера есть одна корова, которая является его фаворитом - часто, что корова показана в мультфильме. Несколько недовольных у каждого стада, главным образом те, кто чувствует, что они должны были появиться в мультфильме, не соглашаются с выбором фермером любимой коровы, которую они пренебрежительно называют священной коровой. В результате каждое стадо теперь выбрало лидера стада.
Это - то, что я думаю, что таблицы должны быть похожими на Вас, может сообщить мне, может ли это быть добито большего успеха? До сих пор я делаю многих многим использующим любимую таблицу, поскольку промежуточное звено - это самое лучшее решение, также никакие SQL-операторы не необходимы, это только в целях дизайна.
Заранее спасибо
Table Herd Table Favorite Table Cartoon Table Cow
PK herdID Intermediate Table PK cartoonID PK cowID
herdname cartoonTitle cowName
herdleader cartoonType
cartoonDate
отредактированное изображение 3:01pmEST это корректно?
cowErd http://img838.imageshack.us/img838/1268/capture3h.png
добавленное новое изображение 8:57 20.07.2010 может кто-то критиковать этот ERD Erd2 http://img37.imageshack.us/img37/5794/capture3fc.png
добавленное новое изображение 12:47 20.07.2010, если нет никакие возражения, это - заключительный проект на объяснение Mark's, отмечает http://img651.imageshack.us/img651/691/capture4b.png ERD
Майкл:
Какие существительные есть в постановке задачи, и сколько их всего?
Farmer - There is one farmer
Cow - There are many cows
Herd - There are many herds
Cartoon - There are many cartoons
Так как есть только один фермер, оставьте его вне будущих обсуждений. Это ваши базовые сущности.
Какие атрибуты есть у каждой сущности?
Cow - each cow has a name
- each cow is a member of a herd
Herd - each herd has a name
- each herd has a cow that is the sacred cow
- each herd has a cow that is the herd leader
Cartoon - each cartoon has a name
- each cartoon may have a cow that appears in it
(not specified definitively)
Итак, некоторые из этих атрибутов ссылаются на другие сущности, а некоторые нет. Атрибуты, которые не ссылаются на другие базовые сущности, просты. Другие требуют более тщательного рассмотрения.
Can a cow be a member of more than one herd?
Must a cow be a member of a herd?
Can a herd have more than one cow that is the sacred cow?
Must each herd have a cow that is the sacred cow?
Can a herd have more than one cow that is the herd leader?
Must each herd have a cow that is the herd leader?
Эти вопросы помогают определить, являются ли отношения между сущностями обязательными или необязательными, и являются ли эти отношения один ко многим или многие ко многим.
Элемент для обсуждения, поэтому я сделал его вики сообщества.
Одна вещь, с которой реляционная модель не справляется, - это обеспечение того, чтобы SacredCow и HerdLeader, удерживаемые на уровне стада, фактически указывали на коров, которые являются членами этого стада.
Скажите, что ваши стада - Звезда и Крест.Детали для «Звездного» стада могут указывать Ригеля как Священную корову и Кастора как вождя стада, но таблица «Корова» может показывать Кастора как члена «Креста». На практике при создании нового стада вы сталкиваетесь со сценарием «курица и яйцо», когда у вас либо стадо без коров (и, следовательно, без вождя стада / священной коровы), либо корова без стада.
Альтернативная модель могла бы иметь таблицу «Корова», указывающую, является ли конкретная корова лидером стада и / или священной корой для своего стада. [В физической реализации было бы возможно для уникального ограничения обеспечить, чтобы у каждого стада была только одна корова, которая была SacredCow, и одна корова, которая была HerdLeader.]. В таблице «Herd» не было бы SacredCow или HerdLeader. . Эта модель не смогла бы обеспечить, чтобы у каждого стада были Лидер стада и Священная корова.
Оба являются моделями. У обоих есть недостатки. На логическом уровне я бы, вероятно, выбрал первое, поскольку оно более нормализовано. На физическом уровне я бы подумал, какое несоответствие вызовет больше проблем и возникнет с большей вероятностью, и выберу модель, которая лучше всего предотвратит его.
Мне нравится, что вы действительно попытались сделать это самостоятельно. На самом деле вы уже почти у цели, так что вы неплохо поработали.
Давайте посмотрим на это с точки зрения объектов/сущностей.
Сущности включают следующее:
Комбинация вышеуказанных полей служит первичным ключом
Как упоминалось в комментариях, вы также можете избавиться от таблицы CowHerds и ссылаться на HerdID непосредственно в таблице Cows.
Часть 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. Это гарантирует, что только коровы в стаде могут стать священными коровами или вожаками этого стада.
Такой дизайн немного усложняет реализацию, но не делает невозможным. Внешние ключи в Herd нужно было бы сделать откладываемыми в базе данных, такой как Oracle, поскольку нам нужно иметь возможность вставлять строки для стада, прежде чем мы сможем вставить строки для коров, а для стада требуется как минимум две коровы ( священная корова и вожак).
Часть 2.
Следующая задача - реализовать следующее ограничение:
only a Sacred Cow may be featured in a Cartoon
Одним из способов сделать это может быть разделение Cows на два отдельных отношения: 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) больше не требуется, потому что теперь это разные коровы по определению.)