MySQL, как установить столбец для ссылки на столбцы из другой таблицы
Я хочу определить значение столбца А в таблице А, чтобы иметь счетчик всех строк в таблице В, где tableB.columnB
У меня есть две таблицы:
articles table
columns: articleId,numComments
comments table
columns: articleId,content
Я хочу, чтобы столбец numComments в "статьях" таблицы содержал количество всех строк в комментариях таблицы, где articles.articleId=comments.articleId
Нужно ли устанавливать какой-либо из них как "innodb"?
2 ответа
Вы можете определить вычисляемый столбец с помощью представления, основанного на ваших двух таблицах, но это ИМХО не является хорошим выбором для того, что вы пытаетесь достичь. Если это будет или станет большой таблицей с большим количеством статей и даже большим количеством комментариев, то подсчет строк в таблице комментариев быстро станет проблемой производительности.
Я бы наверное создал article_comments_count
таблицу, но вы могли бы просто иметь столбец numComments в вашей таблице статей, определенной как число. Затем создайте хранимую процедуру, которая вставит запись в таблицу комментариев и обновит столбец numComments в таблице статей соответственно. Ограничьте доступ к таблице комментариев, чтобы все операции вставки, обновления и удаления проходили через сохраненные_процессы, чтобы можно было обновить значение numComments. Этот метод обновления также позволяет позже добавить другие функции без необходимости изменения кода приложения. В вашем сценарии я мог видеть добавление какого-то белого / черного списка, который будет проверен перед вставкой комментария.
Нужно ли устанавливать какой-либо из них как "innodb"?
Да! InnoDB - единственный mysql-движок, поддерживающий внешние ключи. Вы чем должны сделать следующее:
ALTER TABLE comments ADD CONSTRAINT
FOREIGN KEY (articleId)
REFERENCES articles(articleId);
или если вы просто создаете таблицу:
CREATE TABLE comments
(articleId INT,
content INT,
FOREIGN KEY (articleId)
REFERENCES articles(articleId);
ON DELETE CASCADE // You probably want the comments to be deleted,
// whenever the article is deleted
) ENGINE=INNODB;
См.: http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html
А для столбца numComments: лучше сделать
SELECT count(articleId) FROM comments WHERE articleId=selectedArticleId;