2009-11-13 1 views
7

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

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

ответ

12

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

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

4

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

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

+0

Внешние ключи не применяют правило NOT NULL. Внешний ключ принуждает к ограничению значений столбца. – jabbie

+0

Он не говорит о применении значения NOT NULL, он говорит о том, что у меня нет идентификатора в дочерней таблице, которого нет в родительской таблице. –

+0

Точно. Спасибо, габриэль, для объяснения. – Dmitry

1

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

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

+0

Ссылка, которую вы указываете, относится только к базам данных InnoDB в MySQL. Лучшую ссылку можно найти на странице «http://dev.mysql.com/doc/refman/5.1/en/example-foreign-keys.html». –

+0

Я думаю, что MySQL автоматически создает индексы для первичных ключей и для ссылок на столбцы – Dmitry

2

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

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

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

3

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

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

+0

Ограничение (в частности, UNIQUE), является свойством столбца, а не индексом – Dmitry

3

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

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

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

сообщения дана

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

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

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