Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.05.2012, 14:35   #1
Linel
Форумчанин
 
Аватар для Linel
 
Регистрация: 21.02.2009
Сообщений: 372
Смущение MySQL - выбор ключевых полей для таблицы.

Здравствуйте.

Решил на днях более углубленно изучить MySQL. Нашел свою книгу, которую купил ~1-1,5 года назад:



Так вот. Сейчас читаю про ключи. Возник вопрос, решил спросить тут. Вообщем, в книге говорится, что в качестве ключа можно использовать какое-либо уникальное свойство объекта (ну, или множество уникальных свойств). Например, если объект - человек, то мы не можем использовать в качестве ключа - его имя, т.к. в мире существует огромное количество люедй с таким же именем. Это все понятно, но в книге приведен пример базы данных музыкальной коллекции. Там есть несколько таблиц, среди которых:

1) artist, которая состоит из 2 колонок:
`artist_id` - идентификатор исполнителя (первичный ключ)
`artist_name` - имя исполнителя

Тут, вроде, вопросов нет. Создали поле (`artist_id`), в котором будет уникальное значение и по которому происходит идентификация исполнителя.

Но вот есть еще вот такая таблица album:
`artist_id` - id исполнителя
`album_id` - id альбома
`album_name`- название альбома

Тут используется составной первичный ключ, в который входит 2 поля: `artist_id` и `album_id`. То есть идентификация объекта (альбома) происходит сразу по 2ум полям. Для чего так сделано? Почему нельзя было в качестве первичного ключа использовать только поле `album_id`.

Дальше - больше. Есть таблица с композициями (track):
`artist_id`, `album_id`, `track_id`, `track_name`, `time`.

Тут составной ключ состоит аж из 3 полей: `artist_id`, `album_id`, `track_id`. Почему в качестве уникального ключа нельзя взять только поле `track_id`? Оно ведь уникально. Для чего в данном случае необходим составной ключ? В этом же нет никакой надобности.

Извините, за большое количество букв
No name. Just Linel.
Linel вне форума Ответить с цитированием
Старый 05.05.2012, 19:47   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Если по-хорошему и исходя из структуры данных в таблице album поле artist_id должно быть внешним ключем. В таблице track внешним ключем должно быть поле album_id, а поле artist_id лишнее. В принципе имеет право на жизнь и выше предложенная структура, только похоже ссылочная целостность в ней не поддерживается и вообще в ней явный перебор первичных ключей. Случайно не написано, что такая структура пример того, как не надо делать?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 05.05.2012 в 20:27.
Аватар вне форума Ответить с цитированием
Старый 05.05.2012, 20:35   #3
Linel
Форумчанин
 
Аватар для Linel
 
Регистрация: 21.02.2009
Сообщений: 372
По умолчанию

Аватар, спасибо. А насколько плохо использовать такой подход, как описан в книге. Какие могут быть недостатки данного метода?
No name. Just Linel.
Linel вне форума Ответить с цитированием
Старый 05.05.2012, 20:41   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

В посте #2 почти все написал, что не нравится. Объяснять слишком долго, лучше вы поищите в гугле что нибуть типа "реляционные базы данных нормализация"
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 05.05.2012, 20:57   #5
temaps
Форумчанин
 
Регистрация: 15.05.2011
Сообщений: 160
По умолчанию

Могу предположить, что сделано это только для примера, чтобы показать, что в таком случае, например, album_id может быть не уникальным нужно только чтобы два поля были уникальны вместе, т.е. для артиста 1 может быть альбом 123 и для артиста 2 такие же:
Код:
artist_id album_id
1           1
1           2
1           3
2           1
2           2
В реальности это бессмысленно. Лучше уникальным действительно делать только album_id, а artist_id - внешний. Так и проще и проблем намного меньше. Ведь с одним ключевым полем достаточно сделать его автоинкрементом и проблем не знать, а с двумя нужно сделать за уникальностью, да и найти нужную запись по одному ключу намного проще, достаточно знать только одно число.
PS
Мне кажется меня осенило: тут налицо связь многие ко многим была бы, если бы поле album_name в отдельной таблице хранилось тогда было бы всё верно туг был бы двойной ключ. Может в книге неточность закралась?

Последний раз редактировалось temaps; 05.05.2012 в 21:01.
temaps вне форума Ответить с цитированием
Старый 05.05.2012, 22:34   #6
Linel
Форумчанин
 
Аватар для Linel
 
Регистрация: 21.02.2009
Сообщений: 372
По умолчанию

Цитата:
для примера, чтобы показать, что в таком случае, например, album_id может быть не уникальным
Скорее всего именно в целях этого примера это и сделано.
No name. Just Linel.
Linel вне форума Ответить с цитированием
Старый 12.05.2012, 14:46   #7
googl
Форумчанин
 
Регистрация: 05.06.2010
Сообщений: 154
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
. В таблице track внешним ключем должно быть поле album_id, а поле artist_id лишнее.
как тогда выбрать треки альбома определенного артиста? название альбомов могут же быть одинаковыми? в книге же говорится, что эти таблицы связаны?
у 1 артиста может быть несколько альбомов. Вот тебе и связь один ко многим. в одном альбоме может быть много треков. Вот еще одна связь один ко многим. поле artist_id перенесено автоматом в треки при установке связи. я вот сейчас говорю на примере ER модели данных

А автор, прочитай про нормализацию таблиц

Последний раз редактировалось googl; 12.05.2012 в 14:50.
googl вне форума Ответить с цитированием
Старый 12.05.2012, 21:42   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Сообщение от googl Посмотреть сообщение
поле artist_id перенесено автоматом в треки при установке связи.
и
Цитата:
А автор, прочитай про нормализацию таблиц
Две антагонистические цитаты. И подумать хорошо как можно выбрать треки альбома определенного артиста без artist_id в track
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 12.05.2012, 21:59   #9
googl
Форумчанин
 
Регистрация: 05.06.2010
Сообщений: 154
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
и
Две антагонистические цитаты. И подумать хорошо как можно выбрать треки альбома определенного артиста без artist_id в track
Я же говорил, что рассматривал на примере ER модели. выбрать да. извиняюсь, я не сильно вник. id альбома уже определит артиста.
Изображения
Тип файла: jpg Безимений-1.jpg (73.5 Кб, 218 просмотров)

Последний раз редактировалось googl; 12.05.2012 в 22:03.
googl вне форума Ответить с цитированием
Старый 12.05.2012, 23:13   #10
temaps
Форумчанин
 
Регистрация: 15.05.2011
Сообщений: 160
По умолчанию

На схеме связи идентифицирующие. Поэтому так и получается. Поставь в свойствах "не идентифицирующие" и ключи не будут "бегать" в другие таблицы
temaps вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Access ограничить значение поля таблицы значениями полей другой таблицы Сергей089 Microsoft Office Access 10 08.12.2010 02:22
Выбор полей одного типа Rekky SQL, базы данных 6 03.02.2010 12:23
Объеденение полей запроса в для отображения нескольких полей в одном списке mrCreator Microsoft Office Access 3 08.08.2009 00:53
Данные из двух полей исх. таблицы в одно поле сводной таблицы Strelec79 Microsoft Office Excel 2 02.08.2009 13:59
Выбор данных из таблицы Mysql в кодировке Utf - 8 OSKiller PHP 4 26.01.2008 10:04