Руководство проектирования баз данных необходимо

У владельца молочной фермы, который является также частично занятым мультипликатором, есть несколько стад коров. Он присвоил каждую корову конкретному стаду. У каждого стада у фермера есть одна корова, которая является его фаворитом - часто, что корова показана в мультфильме. Несколько недовольных у каждого стада, главным образом те, кто чувствует, что они должны были появиться в мультфильме, не соглашаются с выбором фермером любимой коровы, которую они пренебрежительно называют священной коровой. В результате каждое стадо теперь выбрало лидера стада.

Это - то, что я думаю, что таблицы должны быть похожими на Вас, может сообщить мне, может ли это быть добито большего успеха? До сих пор я делаю многих многим использующим любимую таблицу, поскольку промежуточное звено - это самое лучшее решение, также никакие 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

6
задан Bill the Lizard 19 September 2012 в 01:58
поделиться

4 ответа

Майкл:

Какие существительные есть в постановке задачи, и сколько их всего?

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?

Эти вопросы помогают определить, являются ли отношения между сущностями обязательными или необязательными, и являются ли эти отношения один ко многим или многие ко многим.

5
ответ дан 9 December 2019 в 20:39
поделиться

Элемент для обсуждения, поэтому я сделал его вики сообщества.

Одна вещь, с которой реляционная модель не справляется, - это обеспечение того, чтобы SacredCow и HerdLeader, удерживаемые на уровне стада, фактически указывали на коров, которые являются членами этого стада.

Скажите, что ваши стада - Звезда и Крест.Детали для «Звездного» стада могут указывать Ригеля как Священную корову и Кастора как вождя стада, но таблица «Корова» может показывать Кастора как члена «Креста». На практике при создании нового стада вы сталкиваетесь со сценарием «курица и яйцо», когда у вас либо стадо без коров (и, следовательно, без вождя стада / священной коровы), либо корова без стада.

Альтернативная модель могла бы иметь таблицу «Корова», указывающую, является ли конкретная корова лидером стада и / или священной корой для своего стада. [В физической реализации было бы возможно для уникального ограничения обеспечить, чтобы у каждого стада была только одна корова, которая была SacredCow, и одна корова, которая была HerdLeader.]. В таблице «Herd» не было бы SacredCow или HerdLeader. . Эта модель не смогла бы обеспечить, чтобы у каждого стада были Лидер стада и Священная корова.

Оба являются моделями. У обоих есть недостатки. На логическом уровне я бы, вероятно, выбрал первое, поскольку оно более нормализовано. На физическом уровне я бы подумал, какое несоответствие вызовет больше проблем и возникнет с большей вероятностью, и выберу модель, которая лучше всего предотвратит его.

4
ответ дан 9 December 2019 в 20:39
поделиться

Мне нравится, что вы действительно попытались сделать это самостоятельно. На самом деле вы уже почти у цели, так что вы неплохо поработали.

Давайте посмотрим на это с точки зрения объектов/сущностей.

Сущности включают следующее:

  • Коровы
  • Стада
  • CowHerds (вы должны связать корову с услышанным)
  • CowCartoon (одна из коров является любимицей, вы всегда можете ссылаться на услышанное этой коровой, поднимаясь вверх по цепочке, используя идентификатор коровы)

Коровы

  • CowID (первичный ключ)
  • CowName (varchar, потенциально это может быть ключом, но но ведь у коров могут быть одинаковые имена?)

Стада

  • HerdID (Первичный ключ)
  • HerdName (Это также может быть первичным ключом, в конечном итоге это ваше решение)
  • CowID (Внешний ключ, помните, что у каждого стада есть лидер коров, вы даже можете разделить это в другой таблице, но это того не стоит)

CowHerds

  • CowID (fK к коровам)
  • HerdID (fk к стадам)

Комбинация вышеуказанных полей служит первичным ключом

CowCartoon

  • CartoonID (первичный ключ мультфильма)
  • CowID ("любимая" корова, указывает, о какой корове фермер собирается написать мультфильм)
  • Published Date (дата публикации)
  • Title ....

Как упоминалось в комментариях, вы также можете избавиться от таблицы CowHerds и ссылаться на HerdID непосредственно в таблице Cows.

1
ответ дан 9 December 2019 в 20:39
поделиться

Часть 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) больше не требуется, потому что теперь это разные коровы по определению.)

1
ответ дан 9 December 2019 в 20:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: