Mysql первичный ключ для таблицы с полями int и varchar? - PullRequest
0 голосов
/ 22 апреля 2011

У меня есть таблица фильмов и я хочу хранить альтернативные названия. Я буду хранить альтернативные названия / псевдонимы в другой таблице. Хотя я не уверен, какой первичный ключ лучше использовать.

У меня будет поле movie_id INT и поле alias varchar(255). Должен ли первичный ключ находиться в обоих полях (поскольку один фильм может иметь более одного псевдонима)? Должен ли я добавить другое поле для первичного ключа вместо этого, например alias_id, который просто автоматически увеличивается, но в противном случае это не имеет смысла. Или этой таблице нужен первичный ключ? Может быть, он просто должен иметь уникальный индекс по псевдониму, а первичный ключ не нужен?

Ответы [ 3 ]

0 голосов
/ 22 апреля 2011

Ваш movie_id может быть вашим единственным ПК и автоинкрементом.Затем создайте FK movie_id в альтернативной таблице псевдонимов, чтобы он соответствовал альту.имя с исходным названием.

movie_id  |  Title
--------------------
1     |  "Jaws"
2     |   "Star Trek"
3     |   "Matrix 3"


movie_id   |   Alt_Title
------------------------
1       |   "Death Shark"
1       |   "Tales of the Deep"
3       |   "Neo is Uber"
1       |   "Another Jaws Title"

Когда вы делаете вставку в таблицу имен alt, вам нужно будет объединить исходный заголовок и вытащить его movie_id для вставки с помощью.

0 голосов
/ 22 апреля 2011

Чтобы ответить на ваш вопрос напрямую, вы хотите, чтобы movie_id был внешним ключом в вашей таблице alt_title.Тогда, возможно, проще всего создать отдельное поле alt_title_id, которое будет основным ключом таблицы alt_title.Я бы не стал называть заголовок первичным ключом, потому что это очень долго и громоздко, чтобы сделать хороший ключ.

Я не уверен, что вы делаете с этими данными, но мой импульс был бы создатьодна таблица для хранения как первичных, так и альтернативных заголовков, а затем просто флаг для идентификации первичного.Предполагая, что у вас есть куча других данных о каждом фильме, вытащите заголовок из основной записи фильма в отдельную таблицу.Если вы поместите их в одну таблицу, то если вы хотите выполнить поиск по первичному или альтернативному названию, вы просто скажете

select whatever
from movie_title
join movie using (movie_id)
where title='Java Forever'

Если по какой-то причине вы хотите выполнить поиск по основному названию, хорошо, вы пишете

select whatever
from movie_title
join movie using (movie_id)
where title='Java Forever' and primary=true

С двумя таблицами, если вы хотите искать по основному названию, конечно, это легко.Но если вы хотите искать по первичному или альтернативному, вам нужен союз, который является медленным и болезненным.Если запрос сложный, объединение нескольких других таблиц или извлечение нескольких полей, всю эту дополнительную сложность необходимо записать дважды, в каждой половине объединения.

0 голосов
/ 22 апреля 2011

во всех случаях вводите первичный ключ в поля id, поскольку хранение данных эффективно, а операции поиска совпадений выполняются быстро.если вы хотите обеспечить уникальность, используйте уникальный индекс для полей, которые вы хотите, кроме первичного ключа.первичные ключи по умолчанию необходимы и уникальны.

...