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;
Другие вопросы по тегам