|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
05.05.2012, 14:35 | #1 |
Форумчанин
Регистрация: 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.
|
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 |
Форумчанин
Регистрация: 21.02.2009
Сообщений: 372
|
Аватар, спасибо. А насколько плохо использовать такой подход, как описан в книге. Какие могут быть недостатки данного метода?
No name. Just Linel.
|
05.05.2012, 20:41 | #4 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
В посте #2 почти все написал, что не нравится. Объяснять слишком долго, лучше вы поищите в гугле что нибуть типа "реляционные базы данных нормализация"
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
05.05.2012, 20:57 | #5 |
Форумчанин
Регистрация: 15.05.2011
Сообщений: 160
|
Могу предположить, что сделано это только для примера, чтобы показать, что в таком случае, например, album_id может быть не уникальным нужно только чтобы два поля были уникальны вместе, т.е. для артиста 1 может быть альбом 123 и для артиста 2 такие же:
Код:
PS Мне кажется меня осенило: тут налицо связь многие ко многим была бы, если бы поле album_name в отдельной таблице хранилось тогда было бы всё верно туг был бы двойной ключ. Может в книге неточность закралась? Последний раз редактировалось temaps; 05.05.2012 в 21:01. |
05.05.2012, 22:34 | #6 | |
Форумчанин
Регистрация: 21.02.2009
Сообщений: 372
|
Цитата:
No name. Just Linel.
|
|
12.05.2012, 14:46 | #7 | |
Форумчанин
Регистрация: 05.06.2010
Сообщений: 154
|
Цитата:
у 1 артиста может быть несколько альбомов. Вот тебе и связь один ко многим. в одном альбоме может быть много треков. Вот еще одна связь один ко многим. поле artist_id перенесено автоматом в треки при установке связи. я вот сейчас говорю на примере ER модели данных А автор, прочитай про нормализацию таблиц Последний раз редактировалось googl; 12.05.2012 в 14:50. |
|
12.05.2012, 21:42 | #8 | |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
и
Цитата:
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
|
12.05.2012, 21:59 | #9 |
Форумчанин
Регистрация: 05.06.2010
Сообщений: 154
|
Я же говорил, что рассматривал на примере ER модели. выбрать да. извиняюсь, я не сильно вник. id альбома уже определит артиста.
Последний раз редактировалось googl; 12.05.2012 в 22:03. |
12.05.2012, 23:13 | #10 |
Форумчанин
Регистрация: 15.05.2011
Сообщений: 160
|
На схеме связи идентифицирующие. Поэтому так и получается. Поставь в свойствах "не идентифицирующие" и ключи не будут "бегать" в другие таблицы
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
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 |