Необходимо руководство по проектированию базы данных - PullRequest
6 голосов
/ 19 июля 2010

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

Вот как я думаю, что таблицы должны выглядеть так: дайте мне знать, если это можно сделать лучше? Пока я делаю много-много, используя любимую таблицу в качестве промежуточного, это наилучшее из возможных решений, также не требуются операторы SQL, это просто для целей проектирования.

Заранее спасибо

Table Herd           Table Favorite               Table Cartoon   Table Cow
PK herdID          Intermediate Table             PK cartoonID     PK cowID
   herdname                                          cartoonTitle     cowName
   herdleader                                        cartoonType
                                                     cartoonDate

отредактированное изображение @ 3:01 pmEST это правильно?

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, если нет каких-либо возражений, это окончательный вариант согласно объяснению Марка знак ERD http://img651.imageshack.us/img651/691/capture4b.png

Ответы [ 5 ]

5 голосов
/ 19 июля 2010

Майкл:

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

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?

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

4 голосов
/ 20 июля 2010

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

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

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

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

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

1 голос
/ 20 июля 2010

Если предположить, что корова может принадлежать только одному стаду за раз, и если предположить, что в одной и той же карикатуре может появиться более одной коровы (очевидно, из разных стад), мое предложение:

Стадное стадо

Herd ID (PK)
Herd Name

Стол Корова

Cow ID (PK)
Herd ID (FK)
Cow Name
Is Leader (Boolean)
Is Sacred (Boolean)

Стол Мультфильм

Cartoon ID (PK)
Cartoon Title
Cartoon Type
Cartoon Date

СтолВнешний вид

Cow ID (PK)
Cartoon ID (PK)
1 голос
/ 20 июля 2010

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

1 голос
/ 19 июля 2010

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

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

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

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

Коровы

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

Стада

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

CowHerds

  • CowID (fK для коров)
  • HerdID (fk to услышаноs)

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

CowCartoon

  • CartoonID (первичный ключ мультфильма)
  • CowID («любимая» корова, ссылки на которую корова собирается написать фермером)
  • Дата публикации (дата публикации)
  • Заголовок ....

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

...