Там нет ничего плохого с двумя столами.
На самом деле все, что вам нужно, это
developer(name) -- company [name] is a developer
publisher(name) -- company [name] is a publisher
Ваши изменения не имеют ничего общего с нормализацией. Нормализация никогда не создает новые имена столбцов. «Я не хочу, чтобы« Nintendo »дублировался, ошибочно. По сути, нет ничего неправильного со значениями, появляющимися во многих местах. См. Ответы от sqlvogel & себя here.
НО: В зависимости от того, что означает, что строка находится в одной из ваших таблиц, может быть лучший дизайн для уменьшения ошибок, поскольку значения двух таблиц могут быть «ограниченными», т.е. зависят друг от друга. То, что имеет какое-то отношение к «избыточность», но касается ограничений и не требует нормализации. И для того, чтобы обратиться к нему, вы должны сказать нам, когда строка входит в каждую таблицу, основанную на мировой ситуации.
Если вы не хотите повторять строки для реализации (-зависимой) причинам (пространство, занимаемое или скорость операций за счет более присоединяется), затем добавить таблицу имен идентификаторов и строк (фактически ид компании и имена) и заменить столбцы и значения старого имени на столбцы и значения идентификатора компании. Но это не нормализация, это усложняет вашу схему ради компромиссов оптимизации, зависящих от реализации. (И вы должны продемонстрировать это необходимо, и работает.)
Принятый ответ просто добавляет много избыточных данных. Подобно тому, как ваш вопрос добавляет три избыточные таблицы. В двух таблицах уже говорят, какие компании являются разработчиками и которые являются издателями. Остальные таблицы - это просто взгляды/запросы на два!
Если вы хотите, чтобы новая таблица для «[id] идентифицировала компанию с именем [name] with ...», то это случай разработчиков и издателей как подтипы компании супертипа. Поиск в подтипах базы данных. См. this answer. Затем вы должны использовать идентификатор компании вместо имени для идентификации компаний. Затем вы могли бы также упростить (!), Используя идентификатор компании как единственный столбец в разработчиках и издателях таблиц, а также везде, а не разработчик_ид и publisher_id.
«Резервирование» не относится к значениям, появляющимся в нескольких местах. Речь идет о нескольких строках, в которых говорится о приложении. При использовании такого дизайна существуют две основные проблемы: говорить о некоторых вещах, связанных с несколькими строками (в то время как нормализованная версия включает только одну строку); и нет никакого способа сказать только одну из вещей за раз (с которой может помочь нормализация). Если вы создадите два разных независимых утверждения о Nintendo, вам понадобятся две таблицы и Nintendo, упомянутые в каждом из них. Строки Re, содержащие заявления о приложении, см. this. (И искать другие ответы на «утверждение» или «критерий» таблицы). Нормализация помогает, потому что она заменяет таблицы, строки которых содержат элементы формы «... И ...» другими таблицами, в которых указано «...» отдельно. См. this и this. (Обычно ошибочно считается, что включение или включение исключает несколько похожих столбцов, избегая столбцов, значения которых имеют повторяющуюся структуру и/или заменяют строки идентификаторами, но хотя это могут быть хорошие дизайнерские идеи, они не нормализуются .)
В комментариях, чат и еще один ответ вы дали эту отправную точку:
Вот простейший дизайн. (Я предполагаю, что названия игр не являются уникальными, так что вам нужно game_ids.)
-- game [game_id] with title [title] released on [release_date] is rated [rating]
game(game_id,title,release_date,rating)
game_developer(game_id,name) -- game [game_id] is developed by company [name]
game_publisher(game_id,name) -- game [game_id] is published by company [name]
game_platform(game_id,name) -- game [game_id] is on platform [name]
Только если вы хотите отдельный список компаний, с тем, что компания может существовать без разработки и публикации и/или может иметь свои собственные данные вам нужно добавить:
company(name,...) -- [name] identifies a company
только если вы хотите данные ролей специфичны для разработчиков и издателей вам нужно добавить:
developer(name,...) -- developer [name] has ...
publisher(name,...) -- publisher [name] has ...
соответствующие внешние ключи различных опций straightward.
Ни одна из ваших версий _id
s.Ваши версии 2 & 3 не будут работать, потому что они не говорят, какие компании разрабатывают игру или какие компании публикуют игру. Вам не нужны роли, но если у вас есть они (Verison 2), тогда вам понадобится таблица «игра [game_id] имеет компанию [name] as [role]». В противном случае (для версии 3) вам нужны таблицы для «[game_id], разработанного компанией [name]», а «game [game_id] публикуется компанией [name]». Где бы вы ни отличались от моих проектов, спросите себя , почему у у вас есть дополнительная структура и почему вы можете обойтись без нее и (возможно), почему вы так или иначе захотите этого.
Я не уверен, что понятие «элегантности» имеет место в нормализации баз данных. Реляционная модель основана на математике, а не на искусстве; есть что-то, называемое логикой предиката первого порядка, в которой мало кто интересуется, но короткая версия: у вас есть отношения «многие ко многим», нравится вам это или нет. Единственный способ выразить это, используя нормализованные таблицы, - это таблица ссылок, полная остановка. – Air
@AirThomas & klandshome: Я согласен с RM и точностью, но здесь нет нормализации и не существует отношения «многие ко многим», кроме одного выводимого из двух таблиц, в котором выражаются отношения «developer [id] - это компания с именем [имя]», и «издателем [id] является компания с именем [name]». – philipxy
Это не имеет никакого отношения к нормализации, и нет необходимости изменять ваши таблицы. См. Мой обновленный ответ. – philipxy