Требуется ли внешний ключ в моей таблице базы данных? - PullRequest
1 голос
/ 05 июня 2011

У меня есть две таблицы mysql для основного дискуссионного форума. Первая таблица содержит темы, а вторая - ответы на конкретную тему. Я хочу знать о концепции внешнего ключа в этом дизайне базы данных. Мне нужно добавить внешний ключ здесь? Как это будет полезно и как я могу добавить в следующих таблицах. Спасибо.

--
-- Table structure for table `topics`
--

CREATE TABLE IF NOT EXISTS `topics` (
  `topic_id` int(11) NOT NULL AUTO_INCREMENT,
  `topic_title` varchar(255) NOT NULL,
  `topic_content` text NOT NULL,
  `topic_author_id` int(11) NOT NULL,
  `topic_date` int(10) NOT NULL,
  PRIMARY KEY (`topic_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

--
-- Table structure for table `replies`
--

CREATE TABLE IF NOT EXISTS `replies` (
  `reply_id` int(11) NOT NULL AUTO_INCREMENT,
  `reply_topic_id` int(11) NOT NULL,
  `reply_content` text NOT NULL,
  `reply_author_id` int(11) NOT NULL,
  `reply_date` int(10) NOT NULL,
  PRIMARY KEY (`reply_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

Ответы [ 3 ]

3 голосов
/ 05 июня 2011

Внешний ключ технически не требуется, но с точки зрения качества данных настоятельно рекомендуется.

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

  • у вас нет дочерних строк (в replies), которые ссылаются на родительскую строку (в topics), которая не существует («данные зомби»)

  • гарантирует, что вы случайно не удалите родительскую строку, если вокруг нее все еще остаются дочерние строки

и, в целом, обеспечивает качество и целостность ваших данных - настоятельно рекомендуемое свойство в вашей базе данных!

2 голосов
/ 05 июня 2011

Как правило, MySQL не требует от вас вставки внешних ключей. Более того, пока вы используете механизм хранения MyISAM, вы не сможете воспользоваться преимуществами определения внешних ключей. Они принимают синтаксис внешнего ключа, но внутренне они просто игнорируют эти операторы, подробности см. запись внешнего ключа в документации MySQL .

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

CREATE TABLE IF NOT EXISTS `replies` (
  `reply_id` int(11) NOT NULL AUTO_INCREMENT,
  `reply_topic_id` int(11) NOT NULL,
  `reply_content` text NOT NULL,
  `reply_author_id` int(11) NOT NULL,
  `reply_date` int(10) NOT NULL,
  PRIMARY KEY (`reply_id`),
  INDEX (`reply_topic_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

Подробнее см. mysql create table .

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

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

1 голос
/ 05 июня 2011

В таблице replies должен быть столбец, содержащий topic_id темы в таблице topics, для которой предназначен конкретный ответ в таблице replies.

например

`topic_id` int(11) FOREIGN KEY REFERENCES `topics`(`topic_id`)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...