В чем разница между индексом и внешним ключом? - PullRequest
10 голосов
/ 14 ноября 2009

Я хочу создать базу данных с 3 таблицами. Один для сообщений, другой для тегов и один, который связывает сообщения с тегами с post_id и tag_id, работающими как ссылки на внешние ключи.

Можете ли вы объяснить, что будет индекс в этом сценарии и чем он отличается от внешнего ключа и как это влияет на мой дизайн базы данных?

Ответы [ 6 ]

14 голосов
/ 14 ноября 2009

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

Внешний ключ - это просто указатель на соответствующий столбец в другой таблице, который образует ссылочное ограничение между двумя таблицами.

4 голосов
/ 14 ноября 2009

У вас будут внешние ключи в третьей таблице. Индексы не нужны, они нужны, если у вас много данных, где вы хотите быстро найти что-то по Id. Возможно, вам понадобится индекс первичного ключа сообщений, но СУБД, вероятно, создаст его автоматически.

Индекс - это избыточная структура данных, которая ускоряет некоторые запросы. Внешний ключ, по практическим соображениям, - это способ убедиться, что у вас нет недопустимых указателей между строками в ваших таблицах (в вашем случае - от таблицы отношений к публикациям и тегам)

3 голосов
/ 14 ноября 2009

Вопрос : Можете ли вы объяснить, что будет индекс в этом сценарии и чем он отличается от внешнего ключа и как это влияет на мой дизайн базы данных?

В этом случае ваши внешние ключи - это два столбца в вашей таблице Posts_Tags. При использовании внешнего ключа каждый столбец внешнего ключа должен содержать значение из основной таблицы, на которую он ссылается. В этом случае таблицы сообщений и тегов.

Posts_Tags-> PostID должен быть значением, содержащимся в Posts-> PostID

Posts_Tags-> TagID должен быть значением, содержащимся в Tags-> TagID

Думайте об индексе как о столбце, которому была предоставлена ​​повышенная скорость и эффективность для запроса / поиска значений из него за счет увеличения размера вашей базы данных. Как правило, первичные ключи - это индексы, а другие столбцы, которые требуют запроса / поиска на вашем веб-сайте, в вашем случае, вероятно, имя сообщения (Posts-> PostName)

В вашем случае индексы мало повлияют на ваш дизайн (их приятно иметь для скорости и эффективности), но ваши внешние ключи очень важны, чтобы избежать повреждения данных (имея значения в них, которые не соответствуют посту) и / или тег).

3 голосов
/ 14 ноября 2009

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

Внешний ключ - это значение в таблице, которое ссылается на уникальный индекс в другой таблице. Он используется как способ связать таблицы вместе. Например, дочерняя таблица может искать одну родительскую строку через свой столбец, который является уникальным индексом в родительской таблице.

2 голосов
/ 14 ноября 2009

Вы описываете очень распространенную конструкцию базы данных; оно называется «отношение многих ко многим».

Индексы не должны влиять на эту схему вообще. Фактически, индексы не должны влиять на любую схему. Индексы - это компромисс между пространством и временем: индексы указывают, что вы готовы использовать дополнительное пространство для хранения в обмен на более быстрый поиск в базе данных.

В Википедии есть отличная статья о том, что такое индексы базы данных: Индекс (база данных)

1 голос
/ 14 ноября 2009

Чтобы использовать внешние ключи в mysql, вам нужно создать индексы для обеих таблиц. Например, если вы хотите, чтобы поле a_id в таблице b ссылалось на поле id в таблице a, вы должны создать индексы для a.id и b.a_id, прежде чем сможете создать ссылку .

Обновление: здесь вы можете узнать больше об этом: http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html

...