Часть I
Пересмотрено 09 декабря 10 01:00 EST
Посмотрел ваш DDL.Хорошо.Нам нужно сделать шаг назад и сначала организовать вашу базу данных.Это решит половину ваших проблем (ваш SQL будет прямым и быстрым; меньше индексов; не требуется временных таблиц).Какое-то время я думал, ага, у тебя есть свои колонки, они должны быть стабильными, но шансов нет.Сверху вниз, ок.Взгляните на эту диаграмму отношений сущностей (бесполезно работать с моделью данных, то есть сущностями, отношениями и атрибутами , пока мы не получим правильные ER) и убедитесь, что она правильная.
Чтобы сделать это, ответьте на следующие вопросы (короткие ответы в порядке).Эти вопросы разъясняют сущности и бизнес-правила .Как вы понимаете базы данных в целом, и ваши данные в частности, имеет решающее значение.Вы сами прошли долгий путь, поэтому мы можем взять его оттуда.
Я думаю ▶ этот пост ◀ можетбыть полезным для вас, чтобы понять формальные этапы, которым необходимо следовать;который мы здесь закорачиваем.
Самое главное, полностью и полностью, забыть о функции и любых требованиях к кодированию.Данные должны моделироваться независимо от приложения, просто как Данные.Функциональное моделирование - это другая наука.Сначала поймите один правильно;тогда получите другое право;и двое вместе играют красивые мелодии.Попробуйте соединить их вместе;выполняя обе задачи одновременно, и они даже не сделают пригородную гаражную полосу.
Для краткости, и ради того, чтобы кто-нибудь читал это, я использую Закрытый и ОткрытыйРаздел;когда открытый элемент (обсуждение) закрыт, я сделаю его сжатым и переместлю его в закрытый раздел.Сохраняйте нумерацию, потому что вещи иногда возвращаются, чтобы преследовать нас.Вы можете сделать то же самое или даже удалить обсуждение на вашей стороне.
Ссылки на красивые картинки в конце.
Извинения: редактирование не работает;суб-нумерация несовместима
Закрытые проблемы
- users.bb_locations_csv - это отношение «многие ко многим» между пользователями и местоположениями:
- Каждый из этихэлементы должны быть записью в отдельном столбце, в отдельной строке
- Один пользователь может иметь много местоположений , а 1 местоположение может иметь много пользователей "многие-ко-многим"
- Прочитайте ▶ этот пост ◀ , чтобы обсудить, как это трактуется и с какой стадией это связано
- На этой логической стадии это просто ::В отношении, как я нарисовал, вы можете пока забыть об этом, оно будет предоставлено просто, когда мы доберемся до физической стадии.
- Поверьте мне, я предоставлю код, который не сложнее, чем
...WHERE IN ()
для вашей заявленной цели. - Если подумать, если я сломаю вам пальцы, вы будете печатать еще медленнее, поэтомуЯ бы лучше не
- Хорошо, ваше приложение основано на браузере, а страница динамическая (мой совет был для статических страниц, которые нужно подправить);установите флажки.
.
- users.bb_categories_csv - это отношение многие ко многим между пользователями и категориями
Подтверждено: бюллетень (bbs) не существует без пользователя;пользователь выпускает бюллетень, и начинается весь цикл;затем предлагает ответы и оценки.
3.1 Подтверждено: на самом деле есть только одна доска объявлений, и она не существует в качестве предмета в базе данных.
3.2 Подтверждено: у организации никогда не будет большечем одна доска объявлений, и классификации и категоризации все соответственно обрабатываются таблицей / функцией категории
Удалено.
Подтверждено. Разница между бюллетенями и ответами заключается в том, что ответы зависят от наличия бюллетеня, не имеют заголовка и не классифицируются по местоположению или категории, поскольку зависят от наличия самого бюллетеня.
Удалено.
Комментарии отмечены.Решено.
7.1.Для каждого отдельного бюллетеня, представленного другим пользователем, каждый пользователь может опубликовать более одного ответа.
7.2.Для каждого отдельного бюллетеня, представленного пользователем, этот пользователь может опубликовать один или несколько ответов.
7.3.Удалено.
7.4.Удалено.
Модель данных теперь позволяет более одного ответа на пользователя на бюллетень;включая пользователя, отправившего бюллетень.
.
8. Подтверждено: каждый пользователь может опубликовать в бюллетене не более одного рейтинга (который может быть отозван / изменен)
.
9. Подтверждено: каждый пользователь может опубликовать не более одного рейтинга в ответ (то же самое)
10.1.Дано: имя пользователя происходит из организации и является уникальным именем, которое идентифицирует сотрудников.Например, электронные письма - username@organisation.org - аутентификация выполняется с помощью ldap, и это необходимо для подключения и получения другой информации о сотрудниках
- Подтверждено: UserName является отличным идентификатором
10.2.Подтверждено: FirstName, LastName ... BirthPlace и т. Д. Остаются (традиционные) столбцы для обеспечения того, чтобы People
не дублировались.
.
11. Учитывая: На данный момент мы можем идентифицировать наши офисы послучайные имена, которые обычно известны в организации, так как у нас всего около 3 основных офисов и много отделений на местах.Так, например, в Вашингтоне или в полевом офисе в Вирджинии.В целом, я думаю, что мы постараемся сохранить общее число ниже 20. Я хочу также записать точный адрес каждого местоположения, поскольку это может быть использовано для уникальной идентификации офисов для пользователей.
- При условии:
StateCode+Town
как ПК;IsMainOffice
как логическое значение.
.
12. Подтверждено: Description
и Name
для Category
обязательны.
.
13. Дано: Пользователи будутне быть в состоянии опубликовать в некоторых категориях.Только пользователи с достаточно высокими правами будут иметь право размещать сообщения в определенных категориях.
- Предоставлено:
Permission
в User, Location, Category
- метод оценки таких прав.
.
14. Подтверждено: Location.Administrator
is UserId
администратора для Location
.
.
15. Дано: Когда-либо будет потребность только в симпатии или антипатиях.Я не думаю, что должна быть нейтральная позиция, потому что это то же самое, что просто не голосовать?Нравится, кажется, больше относится к ответам бюллетеня, что сообщения, чтобы быть честным.Т.е. я вижу ваш ответ, и вместо того, чтобы писать свой собственный, я просто соглашусь с вами - существующая доска объявлений является своего рода социальным аспектом в организации, и я думаю, что симпатия и неприязнь / согласие и несогласие создают уровень противоречий, который поощряет участие,Однако симпатия или неприязнь к бюллетеню не всегда могут быть вполне уместны.
15.1 При условии: Like
как логическое значение в BulletinRating
и ResponseRating
.Это потребует интерпретации при каждом доступе.
15.2.Когда он больше не является логическим значением, его можно изменить на RatingCode
и реализовать в виде таблицы поиска.Имена затем определяются Joins, а интерпретация исключается.Я нарисовал это в Первой модели данных, чтобы вы могли понять, что я имел в виду 15.3.Удалено во второй модели данных.
.
16. Подтверждено: у каждого пользователя есть дом Location
(кроме списка Locations
, который их интересует).
.
17Подтверждено: Permission
согласно (13).
.
18. Подтверждено: Могут потребоваться дополнительные разрешения в соответствии с моделью данных.
18.1.Если вы сделаете это сейчас, вам не придется беспокоиться о том, когда организация решит запретить определенным Person
публиковать Responses
или Bulletins
или оценивать их;и хочет, чтобы эта функция была реализована вчера.
18,2.Даже если вы не реализуете его, оставьте пробелы между значениями, которые вы реализуете.
.
19 Подтверждено: a Bulletin
равно о a Location
.
19.1.Подтверждено: Не существует Bulletins
без Location
19.2.Подтверждено: Bulletins
не существует без Location
.
19.3 Подтверждено: Bulletins
не существует без User
(декларативно).Но пока у нас нет способа ограничить это User
;поэтому любой User
может вставить Bulletin
для любого Location
(вы можете ограничить его в коде, например, Locations
каждый User Is Interested In
.
19.4 Подтверждено: BulletinRatings
нетбез Bulletin
и рейтинга User
.
19,5 Подтверждено: Responses
нет без Bulletin
.
19,4 Подтверждено: ResponseRatings
нет безResponse
и рейтинг User
.
19.7. Но, может быть Users
, Locations , and
Categories`, независимо.
.
20. Если выне возражаю, я приведу соглашения об именах и т. д. Они должны быть самоочевидными, и значение будет отображаться только тогда, когда вы начнете кодировать SQL. Спросите, если что-то не так. Для начала, все имена в единственном числе. Смешанный регистрлегче читать (вы должны использовать заглавные буквы для языка SQL).
20.1. Мой опыт заключается в том, что table_name в отличие от tableName - это действительно технические формы, и пользователям они не нравятся;каждый. Это одна из тех вещей, которые невозможно изменить, поэтому выбираютe. осторожно.
.
21. Если вам нужно сгруппировать таблицы, что хорошо, имейте в виду, что это физическая проблема.На уровне логической модели данных таблицы имеют нормальные имена, не подверженные влиянию физических проблем.Представьте, что перед физическими таблицами стоит что-то вроде (и для этого используйте заглавные буквы):
- REF_
для справки (например, пользователя) и справочные таблицы
- BUL_
для системы Bulletin
.
Я не могу назвать таблицы заглавными буквами?Я не уверен почему.Я не знаю, почему у меня не может быть имен в верхнем регистре.Это связано с использованием таблиц базы данных MyIsam?
Всеобщее соглашение состоит в том, что язык SQL выражается в верхнем регистре;каждый инструмент отчетов и администратора, который я когда-либо использовал, генерирует такой код SQL.Поэтому мы не можем использовать верхний регистр.Только нижний регистр или смешанный регистр.Таким образом, выбор сводится к table_name или TableName;нам нужен какой-то разделитель.По причинам, уже указанным, я настоятельно рекомендую использовать смешанный регистр, заглавные буквы, а не стиль ОО, а начальная буква некапитализированная.
.
22. rank
(все) могут быть получены непосредственно из базы данных (помните, не беспокойтесь о коде во время моделирования данных).Если вы храните его, это ошибка нормализации;дублированный столбец;который должен быть обновлен;который может не совпадать с производным значением;который называется аномалией обновления.Пятая нормальная форма устраняет аномалии обновления.Это мой минимальный уровень нормализации, поэтому вы получите его от меня.
22.1.Я вообще не вмешиваюсь в порядок сортировки или популярность;фактически, по звукам, вы не закрыли эту функциональность.Я беру только лишние данные, ранг столбец , как часть процесса нормализации.
22.2.Вот краткое руководство ▶ ▶ по оператору RANK () (как это обычно известно).Это не ANSI SQL;это расширение Oracle и MS.Однако это не требуется, если вы понимаете подзапросы, поэтому в Sybase его нет.Я сомневаюсь, что MySQL имеет это, так что вам нужно разобраться с этим.Понимание скалярных подзапросов является обязательным условием.Синтаксис Sybase, так что ставьте точки с запятой и т. Д. Не стесняйтесь задавать конкретные вопросы.
.
Я никогда не видел такой подход написания Rank = (SELECT .... Это то же самоеas (ВЫБРАТЬ ...) в качестве ранга?
Для этого я отправил отдельный ответ.
.
22,3, Нужно понять, почему, это не проблема вообще. Только дети слепо следуют простым правилам, и вы определенно не один из них.
.
23. Подтверждено: users.total_bulletins
является избыточным; это может быть получено. Удалены.
.
24. Все ваши ПК являются идентификаторами. Вы еще не устали заблудиться в коде? Забудьте о прикреплении Id
iot PK ко всему, что движется, давайте узнаем, как ваши пользователи идентифицируют свои сущности; какие сущности действительно являются независимыми, а какие зависят от независимых сущностей.
24,1. Никогда не используйте Id
или любую такую форму. Если это ПК, используйте полную форму.
24,2. Вызовите location_id, location_id, где бы он ни находился, включая таблицу PK. Исключение составляют случаи, когда вам нужно показать роль. Это станет ясно в модели данных.
.
25. У вас нет декларативной ссылочной целостности, нет Определено Внешние ключи. Это плохие новости по разным причинам. Как только эти вопросы будут уточнены, пожалуйста, добавьте их. DRI означает, что как можно больше, если не все, целостность объявляется в SQL. Стандарт ISO / IEC / ANSI SQL допускает это, но свободно распространяемая часть рынка не предоставляет этот стандарт и постепенно догоняет его. Это означает, что сервер не позволит добавить строку в таблице FK, если в родительской таблице не существует PK. MySQL недавно предоставил DRI для иностранных ключей. Для FK см. ▶ эту статью 12 .
25,1. Для ограничений CHECK и ПРАВИЛ вы должны будете реализовать их в коде.
мои внешние ключи похожи на: users-id (fk) = users.id (pk) Я не уверен, как добавить их, кроме того, что я сделал, но я обязательно сделаю это, как только узнаю, как это сделать.
Это не добавление их в вашу базу данных; это просто ссылка на столбцы в предложении WHERE
на языке манипулирования данными, а не на язык определения данных. Добавление их, чтобы они функционировали на уровне базы данных / сервера, означает их объявление в DDL, согласно связанной статье. Тогда MySQL остановит вставку строки в дочернюю таблицу (FK), где родительский PK не существует. Это Ссылочная целостность . Если он объявлен в DDL, это Декларативная ссылочная целостность .
В дополнение к применению RI каждый может увидеть определение: пользователи могут использовать инструменты отчетов для доступа к БД и создания отчетов из них, без необходимости заставлять кого-то кодировать отчет.
Да, насколько я знаю. Подтверждено на ▶ этом сайте ◀ . Код, который я предоставил для подзапроса, использует DRI, поэтому мы можем проверить это и забрать его с дороги раньше. Вы должны проверить свою конкретную версию MySQL.
Двадцать пять. Комментарии отмечены. Я не специалист по MySQL. Да, это те проблемы, которые вы должны выяснить для себя. В общем, по моим наблюдениям, MySQL безногий; для чего-либо SQL-иша, вам нужен InnoDB.
Но не позволяйте этому сдерживать вас. Пока используйте Engine = MySQL, без декларативного SQL, и продолжайте работать как с моделью данных, так и с подзапросом. Работа на InnoDB в фоновом режиме.
Для ясности, предоставленный мною DDL должен работать на MyISAM (и "ничего не делать" в отделе DRI, пока вы не получите InnoDB).
.
27. Дано: Я переосмыслил требования к сортировке бюллетеня. Пользователи могут сортировать в хронологическом порядке - легко, имеет смысл. Пользователи могут сортировать бюллетени по дате последнего ответа на бюллетень. Тогда мы можем забыть о рангах, и должно быть действительно легко сортировать бюллетени в хронологическом порядке ко времени их последнего ответа? Что ты думаешь?
Да. это разумно и довольно часто, большинство людей понимают хронологический порядок. Вам придется связываться с фильтрами, которые они выбирают, в окне поиска (выберите: Location
или список; выберите: Category
или список; выберите: Мой Bulletins
или все).
Open Issues
(Nil)
Модель данных
Хорошо, предполагая, что у вас нет проблем с ERD, и реализуя все закрытые проблемы, я смоделировал данные и подготовил Пятую модель данных 09 декабря 10 для вашего обзора. Мне определенно нужны гораздо больше отзывов, вопросов и т. Д. По этому вопросу. Я испытываю трудности с принятием того, что это сделано. Вероятно, лучше всего начать писать реальный код для ваших проблемных областей.
Ссылки
▶ Ссылка на нотацию IDEF1X ◀ Перед прочтением модели данных вам действительно нужно прочитать и понять это.
▶ Ссылка на модель данных Пятого бюллетеня ◀ Диаграмма отношений сущностей находится на первой странице, за которой следует Модель данных .
Ключи в значительной степени прямые IDEF1X (за исключением UserId, который я предоставил в качестве контрапункта); что означает кошелек Relational Keys. Не улучшено и не оптимизировано для физических соображений. Перед тем, как вы сразитесь с ними, сначала обратите на них внимание, зарегистрируйте их и оцените. Конечно, мы можем добавить Id
, но прежде чем мы это сделаем, давайте удостоверимся, что понимаем, что мы потеряем.
Обратите внимание на идентификаторы (сплошные линии) в соответствии с документом обозначений. Позвоночник, позвонки системы: Location ... Bulletin ... Response
.
Обратите внимание, что ключи фактически реализуют множество бизнес-правил.
Обратите внимание на Природную Иерархию, которую я представил. Посмотрите, есть ли в этом смысл для вас.
Глагольные фразы действительно важны; посмотрим, что они значат.
Комментарии по первой модели данных и ответы
Один вопрос, который у меня есть, заключается в том, что первичный ключ местоположения будет использоваться для формирования дочернего первичного ключа? (Они соединены сплошной линией). Я не совсем понимаю эту концепцию
Да. PK для Location
(над линией) - (StateCode, Town)
. Этот PK, состоящий из двух столбцов, составного ключа, в любом случае переносится из Location
в Bulletin
как FK (жирный шрифт). Мы дополнительно используем его для формирования Bulletin
PK (над линией).
Если и когда нам понадобится суррогатный ключ, мы добавим его. На данный момент мы разрабатываем идентификаторы. Итак, вопрос для размышления:
- Что такое хороший идентификатор для бюллетеня? , что ваши пользователи естественным образом используют для идентификации бюллетеня ...
- «Вы видели вчера бюллетень из Вирджинии, штат Пенсильвания?»,
- «Салли из Вашингтона наверняка пишет хорошие бюллетени» и т. Д.
или почему эта связь не существует между пользователем и бюллетенем?
Ну, , что отношение не может существовать между User and
Bulletin
, но отношение существует, пунктирная линия означает, что UserId
- это FK в Bulletin
( жирным шрифтом), но не использовал его для формирования своего PK (ниже линии).
Или вы имеете в виду: пользователь является сильным идентификатором для Bulletin
(и поэтому должен использоваться для формирования Bulletin
PK, поэтому линия должна быть сплошной)?
Fine. Отлично. Вот что такое моделирование идентификаторов. Это проясняет область, которая мне не понравилась, поскольку у нас были неуникальные показатели. Это решает и мою проблему.
В соответствии с указанным выше намерением, поскольку я теперь показал рейтинг в виде таблицы и какой будет визуализация, однажды я ее удалю
Я думаю, что разрешение должно быть сущностью.
Bulletin
PK теперь (StateCode, Town, UserId, SequenceNo)
. Чтобы быть ясным, SequenceNo
находится в пределах StateCode, Town, UserId
: это будет 5 для 5-го бюллетеня Салли о МО / Billngs FO.
Обратите внимание, что пользовательские настройки BulletinsPerPage
и т. Д. Равны 1 :: 1 с User
, поэтому они находятся в User
; дочерняя таблица будет неправильной.
Исправлены опечатки.
Комментарии по второй модели данных и ответы
- The PK для
Bulletin
и Response
были изменены, чтобы отразить (7). BulletinNo
и ResponseNo
были заменены на BulletinDate
и ResponseDate
(которые раньше были CreatedDate
), чтобы разрешить множественные ответы на User
на Bulletin
.
Комментарии по третьей модели данных и ответы
Поверь, у тебя был хороший перерыв.
По крайней мере 30 лет назад (насколько мне известно), гиганты отрасли вели эту дискуссию. Имена всегда в единственном числе. Таблицы являются существительными. Глаголы Фразы - это глаголы. Это не ограничивается соглашениями об именах БД, это относится к документам, тезисам, диссертациям и т. Д. В конце документа может быть 5 выводов, но заголовок раздела или главы, как в ToC, так и в верхней части страницы. такое "Заключение".
После того, как я боролся с ними всюду по Uni, как только я начал свою первую оплачиваемую работу по программированию и увидел важность правил в реальном мире, в отличие от теоретических аргументов, которые мы имели в колледже, я отказался от них. как пустая трата времени. Все то время и силы, которые я потратил, были потрачены на продуктивную работу. С тех пор я не подвергаю сомнению гигантов; Я просто принимаю. Что их умы больше моих. Это похоже на принятие Стандартов, или поведение в рамках закона, или Бога. У меня нет действительно, действительно веских причин делать что-либо незаконное.
В любом случае, простота языка (обсуждение, SQL, документация), поддерживаемая такими правилами, не может быть адекватно объяснена; по мере того, как вы будете писать все больше и больше кода SQL, это станет ясно.
Вы всегда можете использовать все, что хотите. Я доставляю только в единственном числе.
Хорошо со мной.
Но вы должны иметь в виду, что эти два элемента в определенной последовательности (например, не-PK-уникальный индекс или альтернативный ключ) универсально необходимы для установления уникальности личности. Удаление их приведет к двум вещам. Во-первых, вы больше не сможете идентифицировать уникальность по Users
(и, следовательно, у вас могут быть повторяющиеся строки). Во-вторых, АК становится неуникальным, Инверсионный вход.
Суть в том, что (в отличие от одного из постов) любой столбец, имеющий 1 :: 1 с User
PK, должен находиться в User
. Все настройки предпочтений. Поскольку мы убрали InterestedLocations
и InterestedCategories
, я знаю только о BulletinsPerPage
; но я уверен, что есть и другие. IsPreference2
является например. логического; NumPreference3
является, например, целого числа. И т.д. Вы можете сказать мне, каковы настоящие предпочтения.
(Давайте попробуем это во множественном числе: ... любой столбец, который 1 :: 1 с Users
PK, должен находиться в Users
. Просто не делаю это для меня, я зацикливаюсь на ломаный английский, и я немного ценю свой родной язык.)
Модель данных обновлена.
Отлично. Дайте мне знать, когда вам будет удобно, и я дам вам Физическую модель.
Как насчет VerbPhrases?
Комментарии от 06.12.10 20:38 EST (Небольшие обновления)
.
28. Если в качестве FK используется только один PK, имя столбца FK совпадает с именем столбца PK. Тем не менее, когда есть более одного случая ФК (взгляните на ResponseRating
), есть три UserIds
), мы должны их дифференцировать. В терминологии IDEF1X это называется ролями. Роль User
, выдавшего Bulletin
, - Issuer
и так далее. Очевидно, что лучше использовать это имя и сохранять его согласованным по всей иерархии (не UserId
в Bulletin
, а затем, когда мы доберемся до Response
, где их два и требуется дифференцирование, измените его на IssuerId
. Я думал, что у вас могут быть проблемы с этим, на ранних стадиях использование Issuer.UserId
, так что совершенно ясно, что это UserId
как ФК, а роль - Issuer
, когда мы добраться до физической модели, она упрощается до IssuerId
.
Аналогично, у нас есть много столбцов DateTime (для краткости Date, если хотите, иначе Dtm), которые необходимо дифференцировать.
.
29. Разве документ IDEF1X Notation не имеет смысла?
.
30. Потому что (State, Town)
это ПК Location
, несущий куда угодно. И он является частью Bulletin
PK, поэтому любые зависимые таблицы содержат эти столбцы, потому что они содержат Bulletin
PK.
Ищите цветные вкладки (только в этой версии)
.
32. Это глагольные фразы. Способ их прочтения подробно описан в документе «Обозначения». Похоже, у вас есть хорошая ручка. Очень важно правильно определить имена таблиц (и глагольные фразы), потому что изменение трудно осуществить после реализации. Если вы скажете мне, что Office лучше, чем Location, это нормально для меня.
Чтение: Управление активируется в бюллетене
Не стесняйтесь указывать другую фразу глагола.
AFAIC, Office
мёртв для остальной части организации и оживает только на их радаре (активируется) выпуском Bulletin
.
Я понимаю, что здесь это звучит глупо, но не обращайте внимания, что на мгновение что-то вроде "Office
выражает свою живость; рекламирует свою деятельность, выпуская Bulletin
".
Проведите тест в модели данных датчика Марка, чтобы получить несколько хороших глагольных фраз.
Ранее мы определили, что (State, Town)
- это ПК, Я оставлю это как есть См. (38) для изменения.
.
33. Стоит обсудить. Да, если вы собираетесь отображать его, когда (например) отображается Responses
, и пользователи понимают UserName
. Нет, если это 30 байтов, а также есть уникальный 4 байта UserId
. Идея состоит в том, чтобы сделать этот выбор осознанно, осознавая, от чего вы отказываетесь, когда вы в конце концов решите, что какой-то 30-байтовый ключ из 6 столбцов слишком громоздок, чтобы мигрировать на детей.
- В самом начале я указывал, я бы использовал
UserId
как типичный Id
Pk, потому что он переносится / переносится в несколько дочерних таблиц.
- Мы можем оставить как это будет создано на потом. Но это чистый суррогатный ПК.
.
34. Нет проблем. Category
уже есть. Я изменю Order
на ListOrder
.
.
35. Конечно. Исходя из того, что я прочитал и услышал, я вполне доволен этим. Но я бы хотел еще больше обрести уверенность, прежде чем писать код. С другой стороны, рассматривайте это как опыт обучения и принимайте, что модель и код могут измениться позже. Хотели бы вы, чтобы я выпустил Физическое сейчас? Если вы дадите мне какие-либо исправления, я опубликую следующую версию. Я ожидаю предпочтения в User
. Также быстро бегите по функциям и убедитесь, что у вас есть все нужные вам столбцы.
Посмотрите на некоторые другие ответы с целью изучения и интереса.
.
36. Присоединяется. Вы просто присоединяетесь к четырем трем столбцам, а не к одному. SQL громоздок с объединениями, а новый синтаксис, который должен был сделать его проще, на самом деле более громоздок. Мои кодеры никогда не пишут объединения: мы экономим время и опечатки. У меня есть процесс, который с учетом двух или более таблиц будет генерировать код со всеми столбцами и объединениями. Я не знаю достаточно MySQL, чтобы преобразовать это для вас.
Модель данных обновлена.
,
Комментарии по 08 декабря 10 20:49, Четвертая модель данных и ответы
.
Проверьте предыдущий раздел непосредственно выше, есть небольшие обновления.
IDEF1X: Ваша скорость в порядке.
Обратите внимание, что дочерний элемент всегда"наследует" родительский PK как FK (либо сплошная, либо пунктирная линия), в противном случае между ними нет никакой связи.Используя эти столбцы, которые в любом случае существуют в дочернем элементе, для формирования дочернего PK мы несем , означающий (и это разница между сплошным и разорванным).И поэтому нам не нужно искать независимый идентификатор для ребенка.Относительная сила в этом методе станет ясна позже, когда вы будете кодировать.
Раздел, с которым мы имеем дело, касается Идентификаторов : естественный против неестественного;значимый против бессмысленного.Позже вы увидите, как мы можем использовать реляционные возможности движка, когда дочерний PK формируется из родительского PK.(Разве ваша фамилия не совпадает с фамилией вашего отца?)
Также важно понимать реляционные базы данных и их возможности.Это теряется, когда мы подходим к базе данных (например) с точки зрения ОО и рассматриваем ее как местоположение, чтобы сделать наши классы «постоянными».Поэтому мы постараемся выучить и использовать реляционные термины.Трудно, когда вы едете во Францию и ожидаете, что они говорят по-американски и используют ту же валюту;научитесь говорить по-французски на 10 слов, и они встретят вас с распростертыми объятиями, и у вас будет совсем другой опыт с местными жителями.
В любом случае, приступайте к реализации модели.Просто осознайте, что мы, возможно, внесем изменения в какой-то момент.Сохраните все свои DDL.Сохраните все свои тестовые данные в виде операторов вставки или в виде резервной копии таблицы или экспорта в символьный формат (не знаю, что MySQL может / не может делать в этой области)..
37.1.Обработано отношение n :: n с Office
& Category
.Вы только «увидите» это, когда мы доберемся до Физической Модели.
37.2.Готово.
37,3 Готово.
.
38. Отлично.Короче так же.Обратите внимание, что они никогда не смогут иметь два Offices
в одном и том же почтовом индексе.NUMERIC (5,0) это хорошо, но я думал, что США движутся к 7 цифрам.Неважно, вы можете понять это;это отличный ПК для Office
.Теперь этот столбец, который был частью Address
, вероятно ZipCode
, был повышен до более высокой цели, без дублирования;поскольку мы переносим его в 5 дочерних таблиц и хотим, чтобы имя PK было четким, в соответствии с ранее объясненными соглашениями, мы назовем его OfficeCode
;OfficeZipCode
может быть глупым.
Нам нужен уникальный индекс на Name
, чтобы гарантировать, что они не добавят два Offices
с одинаковыми именами.Обратите внимание, что в целях пояснения, это фактически логический ключ Office
, заменяющий (StateCode, Town)
, и он остается таким.ссылка (кроме сидения где-то в Address
)
Модель данных обновлена, пятая теперь доступна для просмотра.Вы не указали свои предпочтения для ...Date
против ...Dtm
.Я иду с последним, поскольку это более аккуратно, идентифицируя и временную составляющую.Легко изменить.
Этот ответ достиг максимальной длины.Продолжение в «Части II»