Благодарность
Я должен сказать, что вы проделали фантастическую работу в (а) схватив элементы моделирования, представленные в вашем предыдущем вопросе и (б) применяя им.Вы прошли долгий путь всего за один день.Это замечательное подтверждение того факта, что при правильном образовании способные люди могут совершать великие дела, выходить из-под контроля своей собственной силы.
Метод
Учитывая вашу заявленную цель и ваши продемонстрированные возможности (не говоря уже о том, что я первым разобрался с SO на вопросы Db Design, который разместил ERD вместо набора DDL), я не буду давать ответы.Я дам вам указания и указания, и вам придется совершенствовать свою собственную модель.
Конечно, я также расскажу о специфике, но я расскажу об одной или двух предметных областях полностью, а не обо всех.Вы можете подобрать это и применить ко всем предметным областям.
Я не ответил на основную предметную область, потому что мы все еще имеем дело с Идентификационными объектами.Когда это будет решено, Reviews
и т. Д. Будет легче;сущности транзакции зависят от идентифицирующих сущностей.
Направление
D.1) Я знаю, что заявил, что мне нужно увидеть всю модель.Есть одно исключение.Исторические или временные данные или данные аудита (например, редактирование и сохраненные версии).На этой ранней стадии их можно отложить в сторону;быть реализованным непосредственно перед завершением логической модели.Это означает, что (а) они являются простыми иждивенцами какого-либо родителя; (б) родители должны сначала смоделировать по отношению ко всем остальным таблицам, и (в) исключить ненужные осложнения и, таким образом, позволить нам сосредоточиться на соответствующихfield.
- в частности, вы можете игнорировать время в глагольных фразах (в любом месте таблицы версий в противном случае потребуется
Has/Had
).Оставайтесь в настоящем времени, пока фокусируется на моделировании, а не на архивировании.
Unresolved
U.1) Необязательный Родитель
Это полностьюнеразрешенный.Не только IDEF1X, но и любым представлением о целостности.Если ссылка FK определена, то должен быть родитель.Чтобы разрешить дополнительных родителей, ссылка FK должна быть удалена (или не реализована).Такое условие исключит результат из определения «Реляционная база данных» по определению.Например.Address:Order
.
- Конечно, в развитых странах
Order
должно иметь Address
по юридическим или налоговым соображениям;это отдельная проблема стандартного требования.
.
U.2) Событие
Party::PartyAddress
является правильным;Address::PartyAdress
правильно.Event::Address
нужна работа.Адрес - идентификационная справочная таблица;если используется, это будет родитель, Event
будет дочерним.Я оставляю вам право идентифицировать / смоделировать несколько Events
для местоположения и Events
в одном или нескольких местоположениях.
Возможно, задействовано место проведения.Или EventOccurrence
Но если это универсальный Event
, который происходит в нескольких местах, который не нуждается в сущности, Address
уже находится в Order
.
U.3) Предполагая, что Catalog
- это запись в традиционном смысле (JCPenney 2011), список предметов для продажи или проката.
OrderSaleItem
правильно
Критическая точка.Catalog
является зависимым и может существовать только в контексте Band
, как Assset.Хорошо.Это означает, что в базе данных нет других товаров, кроме товаров группы.Правильно?
Я вижу, как «Вечернее представление с Братьями Блюз» - это Event
, который можно заказать, выставить счет и оплатить.Также рассмотрены, прокомментированы и т. Д.
Я не вижу, как Song
вписывается в это.Группы продают альбомы, песни или и то, и другое?
Нет ли другой продукции группы: сувениры для концертов / мероприятий;плакат;рюмки с гравировкой?
В соответствии с соглашениями об именах, на которые вы ссылаетесь, и с остальной частью базы данных, Catalog
(cotent) должен называться Item
(строка). Вы уже (естественно?) Использовали это в OrderSaleItem
(в отличие от OrderSaleCatalog
.
U.4) Жанр
Нет проблем с an Item is classified by one-to-many Genres
.
Я думаю, что дополнительно a Genre classifies one-to-many Items
. Отношение один-ко-многим (которое будет преобразовано в ассоциативную таблицу, когда мы перейдем к физическому).
U.5) Избранное
Мощность Item::Favorite
перевернута. Когда вы исправите это, предметная область Favorite
потребует дальнейшего моделирования.
Круговая зависимость или двойные пути между одной и той же парой сущностей является сигналом неразрешенной модели. Обычно одно правильно, а другое избыточно. (Есть исключения, но не здесь; и когда это происходит, глагольные фразы различают их.)
Либо Band::Favorite
xor Item::Favorite
правильно, но не оба.
Item::Favorite
кажется правильным, потому что Band
уже идентифицирован в Item
Аналогично, один Favorite
Сущность для групп и товаров не звучит солидно. Каждый идентификатор в единственном объекте Favorite
является Party
. Он сломается, когда мы нормализуем, может также потребовать уточнения идентификаторов на этом этапе. Это либо одна сущность с некоторой формой дифференциации (FavoriteType
), которая определяет ее обращение; или один Favorite
для полос и другой для товаров, в этом случае дифференциация не требуется, двусмысленность устраняется.
U.6) Бизнес-правила
Вероятно, это единственная область, в которой вы слабы. Общий ответ. Вы выполнили задачи отдельно (все моделирование и написание БР). Они не соответствуют модели. Когда вы пройдете следующий цикл, примите бизнес-правила в качестве директив и модулируйте их одновременно, как с сущностями, отношениями и глагольными фразами.
Вопрос
Q.1) Пользователь / Друг
У вас есть суть этого прекрасно. И кардинальность отношений. (Полное лечение на этом.) Это верно для Принято Friend
.
поэтому время должно пройти (идти с рядами большинства)
Requested
и в ожидании Accepted
составляют меньшинство. Легко реализуется в IsAccepted
бит или логическое значение.
Позже у вас может быть IsRejected
или IsBlocked
(последний должен быть отдельной сущностью).
Это то, что вам нужно?
Q.2) На чем основывается Person is zero-to-many Users
?
Незначительный выпуск
M.1) Только в единственном числе.
М.2) Party Has zero-to-many Addresses
. Я думаю, у них должен быть один, чтобы вести бизнес (но, возможно, не для всех Users
).
М.3) Order May Have zero-to-many Payments
. «Требуется» означает, что первый Payment
должен быть вставлен одновременно с Order
.
- Аналогично, для любых обязательных детей (один-ко-многим, а не ноль-ко-многим) этот первый ребенок должен быть вставлен одновременно с родителем. Это делается с помощью транзакций в корпоративных базах данных, поскольку Немедленная проверка ограничений ( not Deferred); и маленький конец города борется за глупые вещи, такие как Отложенная проверка ограничений «лучше», а затем тратит половину своей жизни на выяснение того, как не попасть в бесконечные петли, которые они создали, которые заманивают их в ловушку. MyNonSQL не имеет вообще ничего, так что не стоит беспокоиться об этой реализации.
M.4) OrderSaleItem
должно быть OrderItem
xor Order
должно быть OrderSale
. Зависит, если вы планируете OrderPurchase
в будущем.
▶ Пример предметной области ◀
Читатели, не знакомые со Стандартом моделирования реляционных баз данных, могут найти ▶ IDEF1X ◀ полезным.
Какзаявлено, я не предоставляю готовую модель данных, только руководство. Это только одна последовательность одной выбранной предметной области. Оно не является «правильным» или полным в любом случае.
Ваши глагольные фразы превосходны. Я предоставил вам альтернативные варианты, которые не являются «правильными» или «лучше». вам нужно выбрать прогресс их или свой собственный. Цель - быть максимально лаконичным и точным ПО в каждом конкретном случае.
Нет предположения, что Person
правильно и User
неверно, что ожидает вашего ответа. Но я должен был что-то использовать в модели; поскольку вы смоделировали их как отдельные, может быть интересно оценить контрапункт.
Хорошо, продолжайте, продолжайте модель, затем отправьте сообщение снова (просто отредактируйте вопрос, оставив параметры заголовка и заменив остальные).
V1.1 и ответ
Это, безусловно, прогрессия.
Я перенумеровал элементы в псевдоправовом формате, включая заголовки разделов, чтобы мы могли сохранить нумерацию и продолжать ее добавлять. На самом деле это действительно облегчает проблемы редактирования SO.
U.3) Требуется ли полная переработка раздела Каталога или только идентификационные отношения, которые существуют с группой?
Нет. Это замечательная вещь для работы на этом уровне, решения, которые вы принимаете здесь, будут на железнодорожных путях, по которым данные передаются, в качестве груза или не отправляются (и поэтому для их получения требуется альтернативный транспорт и тяжелый подъем в форме массы кода или дополнительное хранилище данных). И решения здесь дешевы (время моделирования, бумага).
Прямо сейчас Предмет существует только в контексте группы. Это зависит. Чтобы разрешить внеполосный товар, он должен быть независимым. И тогда существующий кластер супер / подтип требует доработки.
Попытка мод для продажи как полных альбомов или песни. В любом случае они оба будут в электронном формате, доступном только для скачивания. Вот почему я перечислил альбом как состоящий из песен
- Ok. Но теперь вы можете продавать только альбомы, а не песни.
, а не 2 отдельных объекта.
Не уверен, что вы имеете в виду (у вас есть две отдельные сущности).
Похоже, вы не видели мой ▶ Пример предметной области ◀ . Обратите внимание , что если вы откроете его сейчас, он содержит биты, которые у меня есть добавлен V1.1 ; У меня не изменилось что было вчера, ответ V1.0.
На самом деле это означает, что вы должны снова пройти через мой ответ V1.0 при просмотре примера.
U.5) ... но как мне не понятно. Что мне здесь не хватает?
Примером одной сущности с дифференциацией является любой из имеющихся у вас кластеров Супертип / Подтип. Фаворитом является Supertype, BandFavourite и ItemFavourite являются подтипами; позволяя каждому ссылаться на Band xor Item соответственно.
Вы смоделировали ItemFavourite. Теперь вопрос в том, означает ли факт ItemFavourite, что группа является фаворитом; или BandFavourite - это отдельный факт? В этом примере я смоделировал последний без структуры Favorite :: ItemFavourite / BandFavourite.
Q.1) Да, я хотел бы, чтобы вас приняли, отклонили и заблокировали. Я не уверен, что вы имеете в виду, как это изменит логическую модель?
Без изменений (я уже говорил, что оно довольно завершено) до V1.0, но вам может понадобиться дополнительная сущность.
Вам нужны три Битовых или Булевых индикатора в Friend. Это будет обслуживать эти статусы:
Requested
(но не принято)
Requested & Accepted
,
- Но заблокированный не является другом (или мог быть другом ранее, но не с момента блокировки). Таким образом, либо имя сущности должно быть изменено, чтобы отразить, что (без изменений двух отношений) xor Заблокированный должен быть отдельным сущностью. Два отдельных значения для второго отношения приводят к сложности, поэтому я бы пошел с последним.
С первым у нас есть дополнительные статусы:
Blocked
,
- Тогда глагольные фразы нуждаются в изменении (и я добавлю RoleName для ясности), и один из них имеет альтернативное значение.
,
- (Это будет намного яснее на модели уровня атрибутов, поэтому мы моделируем изображениями, а не словами; поэтому я включил его.)
Q.2) Лицо не обязательно должно быть пользователем. Они могут существовать только как BandMember. Это то, что вы спрашиваете?
Нет. Почему мы должны различать человека и пользователя? Каковы отдельные действия или атрибуты? Пока я вижу Личность и Пользователя как одну и ту же сущность; Персона является Пользователем без активности.
Это последний пункт, удерживающий нас от работы с основной предметной областью.
M.3) Мне нужно больше узнать о проверке ограничений, чтобы убедиться, что я все понимаю.
- Не беспокойся об этом сейчас; Я дал вам причину, чтобы сделать это простым (NonSQLs, кажется, упрощают вещи, но на самом деле они делают это более сложным). MyNonSQL не обладает ни одной из этих возможностей, поэтому вы можете исключить возможность рассмотрения платформы и просто разумно смоделировать кардинальность.
M.4) Зависит от того, планируете ли вы OrderPurchase в будущем. Можете ли вы расширить, что вы имеете в виду здесь?
В контексте модели. Вы предоставляете структуры для создания SalesOrders (из Предметов). Поэтому Item, Order и OrderItem.
Но если вы также предоставили структуры для отслеживания заказов на покупку (для покупки предметов, а также канцелярских товаров, аренды и т. Д.), То вам необходимо различать заказы на продажу и заказы на покупку. Поэтому:
- Пункт
- OrderSale и OrderSaleItem
- OrderPurchase и OrderPurchaseItem
Версия 1.1
U.2) Событие выполнено
EventDate выглядит хорошо. Я бы определил отношение как Event Was Perfromed On EvenDate
.
В то время как ItemGenre совершенен, Event :: Venue нуждается в работе. Это ошибка, которую вы делаете постоянно, поэтому требуется объяснение.
Вы правильно смоделировали Venue
, он независим и существует вне контекста Event
. Но Event May Be [Held] At zero-to-many [Independent] Venues
невозможно.
Мероприятия проводятся на многих площадках, а на площадках проводится множество мероприятий. Если это все, так как это логический уровень, вы можете нарисовать отношение многие ко многим, и все готово. На физическом уровне это отношение разрешается путем реализации ассоциативной таблицы, в которой PK является двумя родительскими PK, а данные отсутствуют. (Враг хороший пример.)
Но если есть данные (например, вам нужно отслеживать дату или количество посетителей или что-то еще), то это не Ассоциативная таблица, это другая сущность. То, что происходит между событием и местом.
EventDate - хороший кандидат. У нас уже есть это и дата. Просто добавьте место и перемешайте. Я бы назвал вещь, которая происходит между событием и местом проведения, спектаклем.
Аналогично, EventAddress прогрессировал, но не завершен.
У событий есть адреса или у мест есть адреса? (смоделируйте, слова не нужны)
Если Место проведения: вам нужны все исторические Адреса для Места проведения (например, Партия) или только текущий (как Заказ)?
M.5) SubGenre.Можете ли вы объяснить, почему SubGenre является (а) независимым и (б) отношение неидентифицирующее.
M.6) Item Is zero-to-many Favourites
.Поэтому: Item Is a Favourite of zero-to-many Users
.Точно так же, Each User Chooses zero-to-many Favourites
.Следовательно, Each User Chooses zero-to-many Favourite Items
.
V1.2 и Ответ
Большой прогресс.
U.2) Событие, продолжающееся в дальнейшем
Также и в вашем редактированиикак новые требования, некоторые да, а некоторые нет.Все остальные предметные области модели данных в значительной степени завершены (для логики), эта область запутана, а не почти решена.Частично из-за добавленных требований (никаких претензий, которые случаются в реальной жизни; речь идет о том, как вы справляетесь с этим).
Главное, что я здесь укажу, это то, что Модель данных всегда должна моделировать реальный мир,в отличие только от бизнес-требований.Это (а) изолирует DM от эффекта изменения и (б) обеспечивает надежную платформу для дополнительных требований.Это не означает, что вы должны моделировать весь реальный мир, но его части, которые вы моделируете, должны отражать реальность, а не сдавливаться, чтобы выполнить только Требование.
Во-вторых, отсутствует ясность в отношенииразличия между Событием, Band-Event, Исполнением и т. д. Сейчас событие - это Party-Band-Item-Event.Это нормально, но это не работает для нового стиля Событие в соответствии с Требованием.
В-третьих, у вас есть хорошая ручка для Адреса Сторон и Порядка, но не для Места проведения.
Поскольку вы принимаете стандартную модель и, следовательно, обработку, адрес является справочной таблицей.
Независимо (квадратные углы)
На самом деле, вы можете разместить Адрес и все, что выше него, на первой странице;делая эту часть страницы модели второй, и на этой странице есть только Адрес.
Правильно смоделировано: Сторона имеет историю адресов.У них должен быть хотя бы один текущий {IsBilling |IsShipping |IsPhysical} Адрес, основанный на том, какое действие выполняется.
Правильно смоделировано: у заказа есть один адрес IsBilling (если вам нужен IsShipping, вам нужно добавить отдельное отношение).
Адрес не является дочерним по отношению к месту проведения (также независимо, правильно).Я не думаю, что место проведения находится в адресах от нуля до многих.(Возможно, это старая ошибка, связанная с кардинальностью, но я не уверен, из-за другой путаницы, связанной с событием и местом проведения.)
На самом деле Address :: Order является подозрительным.(Q.3) Хотите, чтобы Заказ указывал на какой-либо действительный Адрес или конкретный адрес Стороны, выполняющей Заказ?
Назад к событию.Принятие EventDate как объявлено.Это хорошо, но тогда Обзоры и т. Д. Относятся к общему концерту, а не к единственному концерту, который они исполняли на грибах.Перейти на V1.3.
Ваша терминология относительно события и т. Д. Соответствует требованиям и т. Д., Но не поддерживает указанное требование.
Итак, давайте начнем использовать «событие» так, как оно используется в реальном мире, и смоделировать его таким образом.То, что мы называем «Событием», Party-Band-Item, на самом деле является Производительностью.И не общий, который запланирован, а один на определенном объекте.
Это либо то, что вы имели в виду с EventDate, либо EventDate преобразуется в Performance.
Если вы не возражаете, я не буду печатать тысячу слов и дам вам картинку. ▶ Пример предметной области V1.2 ◀
Обратите внимание, что разрешены несколько полос на одно событие.
И глагольные фразы прямо с небес.В адресе размещалось несколько мест, каждое из которых обслуживало несколько событий, каждое из которых представляет собой несколько представлений, каждое из которых представляет собой один элемент группы вечеринки.
U.3) Не пора ли вместо этого переместить связь между Предметом и Группой до Предмета и Группы?При нынешнем дизайне я не вижу возможности продавать товары, не привязанные к группе, как вы воспитали.
Во-первых, нам нужно использовать реляционную терминологию, а непотому что я педант, а потому, что настоящие гуру говорят, что это действительно помогает совершить переход в Реляционный мир.
Во-вторых, мы не можем достичь этого, "двигая Отношение".
Вы должны смоделировать внеполосные товары: как вы собираетесь их продавать;отслеживать это;получить за это деньги.Нужны ли вам обзоры, отзывы и т. Д. Я не понимаю, какое отношение имеет к этому партия, и сейчас мы продаем предметы группы, а не предметы партии.Рассмотрим проблемы ссылочной целостности.
Версия 1.2
AR.1) После выполнения упражнения для FavoriteItem я чувствую, чтоЭлемент для обзора требует отношения многих ко многим, так что это указано.Необходимо?
В версии 1.1 у предмета было много обзоров, и отзыв был об одном предмете.Человек сгенерировал много отзывов (по одному на каждую вещь)Это логично.
A Review is about many Items
недопустимо.
Во всяком случае, теперь, когда FavouriteItem / FavouriteBand разрешен, Review также необходимо разрешить.и различие: нужно ли отличать BandReview от ItemReview;хороший / плохой ItemReview указывает на хороший / плохой BandReview или они дискретны?
Обзор (в его нынешнем виде) не может быть о либо группа или предмет.Это означает, что два Иностранных Ключа, и один из Воля Нулевой, и Нулевых FK не допускаются.Предмет и полоса уже дифференцированы, и эта дифференциация является зрелой.
Обзоры предметов можно суммировать и т. Д., Но это другая история.
U.7) Это оставляет нам новую проблему для решения.Если рецензия может касаться группы, альбома, песни или исполнения, как мы можем обеспечить ссылочную целостность.Нам не нужен AlbumReview для ссылки на SongReview и т. Д. Моделируйте его.
R.5) В настоящее время модель предоставляет жанр на уровне элемента, это означает, что альбом и песня (товары могут быть запрещены с помощью ограничения CHECK).Не группа.Этого может быть достаточно, учитывая, что (a) группы меняются со временем, (b) такая классификация на уровне Предметов является более точной, и (c) жанр группы может быть легко получен из их альбомов или песен.
Если вам нужны отдельные жанры групп, вам нужно добавить это.
А как насчет Event Genre?Если вам это нужно, я думаю, что это будет один Жанр на Событие.
Имейте в виду, что таблицы, такие как Место и Жанр, являются серьезными критериями поиска в основной базе данных.Векторы для анализа.
- Мальчики из хранилища данных должны добавить это как Измерения к своим фактам;в правильно смоделированной базе данных они уже существуют как измерения фактов. Покажите мне все места с запланированными мероприятиями "Народная музыка", которые собрали более 10 000 человек. очень просто.
.
- Точка обсуждения.Не сказать, что выше это неправильно.То, что я нашел и в базах данных, и в iTunes, - это точность.Почему Laissez Faire Жанр :: Несколько вещей, когда вы можете иметь Жанр :: Конкретные вещи.Если у вас был только Genre :: Song, а у Song только один жанр, то Album и Band - точные свертки.То, как мы это имеем сейчас, зависит от музыкальных знаний человека, занимающегося вводом данных, и Genre :: Thing очень много, поэтому он бесполезен.Жанр :: Песня жесткая.
R.6) участники могут показать, что они будут присутствовать на Событии не моделируется.Также уточните проценты против бронирования против посещаемости.
R.8) Не моделируется.
M.3) Проблема закрыта, но глагольная фраза остается неизменной.
M.7) Логическая модель в сравнении с ассоциативными таблицами.Теперь, когда эта проблема закрыта, удалите все ассоциативные таблицы для логической модели;любые оставшиеся таблицы (между двумя родителями) будут содержать данные.Это означает, что просмотрите все зависимые таблицы и удалите все, у которых нет данных.Таким образом, V1.3 должен быть менее загроможденным.
M.8) Item is OrderItem.
M.9) Теперь, когда Party-Person-User разрешен.Для структуры Exclusive Subtype требуется Discriminator , а Constrainst будет использоваться для обеспечения целостности.Там, где их много, PartyType - это путь.Но только для двух вполне достаточно столбца IsBand
или IsPerson
.
M.10) Вы исправили ошибку, связанную с кардинальностью, но некоторые глагольные фразы все еще идут не в ту сторону.
27 января 11
На самом деле, я думаю, что многие из этих вопросов будут понятнее, если мы перейдем на уровень логического ключа / атрибута (а не просто уровень отношения сущностей).И нам давно пора.Например:
Q.3) Заказ: Адрес подозрительный.Ограничение не совсем корректно, потому что это позволило бы заказу иметь любой адрес, а не адрес, специфичный для стороны, выполняющей заказ.
Но так как вы являетесь MyNonSQL, который имеетнет ссылочной целостности, вы можете не знать, как это делается в реальном SQL, поэтому я предоставлю определения FK, которые также являются ограничениями RI.Как-то несправедливо ожидать, что вы поймете мои краткие утверждения, которые основаны на RM, нормализации и поддерживаются SQL, когда у вас нет SQL.
- Для того, чтобы два ограничениябыть правдой, так как Party должен быть одинаковым в каждом Ограничении (имеется только один
Order.PartyId
), будет разрешено только подмножество PartyAddress, которое принадлежит PartyId.
▶ Пример квалификации адреса ◀
Продолжение в части II ...