Это мой первый вопрос для stackoverflow, поэтому, если я что-то не так, пожалуйста, дайте мне знать, я исправлю это как можно скорее.
Итак, я пытаюсь создать базу данных для Tv Shows, и мне хотелось бы узнать лучший способ и сделать мою текущую базу данных более простой (нормализацией).
Я мог бы иметь следующую структуру или подобное.
Fringe
Season 1
Episodes 1 - 10(whatever there are)
Season 2
Episodes 1 - 10(whatever there are)
... (so on)
Burn Notice
Season 1
Episodes 1 - 10(whatever there are)
Season 2
Episodes 1 - 10(whatever there are)
... (so on)
... (More Tv Shows)
Извините, если это кажется неясным. (Просьба уточнить)
Но структура, которую я сейчас имею, - это 3 таблицы (tvshow_list, tvshow_episodes, tvshow_link)
//tvshow_list//
TvShow Name | Director | Company_Created | Language | TVDescription | tv_ID
//tvshow_episodes//
tv_ID | EpisodeNum | SeasonNum | EpTitle | EpDescription | Showdate | epid
//tvshow_link//
epid | ep_link
Директор и компания связаны идентификатором с другой таблицей со списком компаний и директоров.
Я уверен, что есть более упрощенный способ сделать это.
Спасибо за помощь заранее,
Кришантан Лингесваран
Я уверен, что есть более упрощенный способ сделать это.
Не знаю, насколько я знаю. Ваша схема близка к простейшему, что вы можете сделать для того, что я предполагаю, это функциональность, о которой вы просите. "Усовершенствования" на этом действительно только усложняют его, и его следует добавить, поскольку вы судите о том, что на вашей стороне возникает необходимость. Следующие примеры приходят на ум (ни одна из которых действительно упрощает вашу схему).
shows.id, episodes.id, episodes.show_id, link.id, link.episode_id
.SeasonNum
, как я полагаю, будет int
в таблице Episodes, на мой взгляд, нарушает ограничение нормализации. Это не является серьезным нарушением, но если вы действительно хотите придерживаться этого, я бы создал отдельную таблицу Seasons и связал ее много-к-одному с таблицей Shows, а затем связал Episodes только с Seasons. Это дает вам возможность, например, прикрепить информацию к каждому сезону. Кроме того, это предотвращает повторение информации (в то время как тип столбца внешнего ключа сезона ID в таблице Episodes якобы по-прежнему остается INT, внешний ключ философски сохраняет ассоциацию, что вы хотите, по сравнению с немыми данными, что у вас есть).Нижняя строка, касающаяся всех этих предложений: Выберите, что подходит для вашего проекта. Если вам не нужна функциональность, предоставляемая этим уровнем ассоциаций, и вы не возражаете, чтобы вручную вводить повторяющиеся данные (вы можете в конечном итоге реализовать автоматическую систему, чтобы помочь вам), вы можете замаскировать часть нормализации ограничения.
Нормализация - всего лишь предложение. Выберите, какое право для вас и учитесь на своих ошибках.
Основной концепцией нормализации является идея, что вы должны хранить только одну копию любого элемента данных, который у вас есть. Похоже, вы уже неплохо начали.
Есть два основных способа моделирования того, что вы пытаетесь сделать здесь, с эпизодами и шоу. В мире баз данных мы могли бы услышать термин "один ко многим" или "многие ко многим". Оба они полезны, это зависит только от конкретной ситуации, чтобы знать, какая из них правильная. В вашем случае, большой вопрос, чтобы задать себе вопрос, может ли один эпизод принадлежать только одному шоу, или эпизод может принадлежать сразу нескольким шоу? Я объясню две формы и почему вам нужно знать ответ на этот вопрос.
Первая форма - это просто отношение внешнего ключа. Если в таблице эпизодов есть две таблицы, "эпизоды" и "показы", у вас будет столбец с именем "show_id", который содержит идентификатор одного (и только одного!) Шоу. Вы видите, как вы никогда не могли бы иметь эпизод, принадлежащий более чем одному шоу таким образом? Это называется отношением "один к многим", т.е. Шоу может иметь много эпизодов.
Вторая форма - использовать таблицу ассоциации, и это форма, которую вы использовали в вашем примере. Эта форма позволит вам связать эпизод с несколькими шоу и поэтому называется отношением "многие ко многим".
Существует некоторая польза от использования первой формы, но в большинстве случаев это не очень большая сделка. Ваши запросы будут немного короче, потому что вам нужно присоединиться только к двум таблицам, чтобы получить эпизоды → показы, а другая таблица - еще одно соединение. Это действительно сводится к выяснению, нужны ли вам отношения "один-много" или "многие-многие".
Примером ситуации, когда вам понадобится отношение "многие ко многим", было бы, если бы вы моделировали библиотеку и должны были отслеживать, кто проверил, какую книгу. У вас будет таблица книг, таблица пользователей, а затем таблица "книг для пользователей", в которой будут идентификаторы, book_id и user_id, и это будет отношение "многие ко многим".
Надеюсь, что это поможет!
tv_id
который, предположительно, сопоставляется с соответствующим телешоу. И, кроме обобщенных примеров, это единственная разумная модель в данном конкретном случае. Я не могу представить определение «эпизода», который позволил бы разделить его между несколькими телешоу. :)