Что лучше между натуральными и составными ключами в этой ситуации? - PullRequest
1 голос
/ 08 января 2012

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

CREATE TABLE `posts` (
    `post_id` INT NOT NULL AUTO_INCREMENT,
    `user_id` BIGINT(20) NOT NULL,
    `title` VARCHAR(100),
    `content` TEXT
) ENGINE = MyISAM;

Мой вопрос: как лучше определить мои ключи?

  1. Лучше ли использовать мой AUTO_INCREMENT ing 'post_id' только в качестве первичного и уникального ключа, учитывая количество записей, которые необходимо сохранить?

  2. Должен ли я использовать 'post_id' и 'user_id' в качестве составного ключа для использования в качестве первичного и уникального ключа?Если это лучше, как я могу использовать его в других таблицах в качестве внешнего ключа?Могу ли я просто добавить их в виде столбцов в этих таблицах?

Не могли бы вы также указать преимущества и недостатки (если таковые имеются) каждого из них и, возможно, несколько советов о том, какой ДВИГАТЕЛЬ использовать.Я думаю, что Innodb будет лучше, если я воспользуюсь вторым вариантом.Я не знаю.

1 Ответ

1 голос
/ 09 января 2012

Независимо от того, используете ли вы автоинкрементное поле в качестве первичного или составного ключа с использованием post_id и user_id, в основном получится следующее:

Если у вас есть дочерние таблицы в вашей таблице posts, вы когда-нибудь захотите запросить эти таблицы, используя user-id сообщения?

Например, если другим пользователям разрешено комментировать сообщение, и у вас есть таблица comments, видите ли вы причины, по которым вам нужно получать данные из таблицы комментариев, где вы запрашиваете user_id из оригинальный пост?

Если это так, то при использовании автоинкрементного поля вам всегда придется присоединяться к родительской таблице (posts), чтобы запрашивать данные в вашей дочерней таблице на основе user_id:

SELECT comments.* 
FROM comments
INNER JOIN posts ON
    posts.post_id=comments.post_id
WHERE posts.user_id='scott.korin'

Это может привести к снижению производительности, особенно если вы ожидаете миллионы строк данных в таблице posts.

Если у вас нет необходимости запрашивать дочерние таблицы с использованием поля user_id, я бы использовал автоинкрементное post_id. Просто убедитесь, что вы определили поле достаточно большим. (если вы исключаете миллионы записей, вы не хотите застрять только с несколькими миллионами записей, потому что вы сделали поле post_id слишком маленьким) .

...