Лучший способ сохранить количество детей в родительской таблице в MYSQL - PullRequest
1 голос
/ 18 февраля 2020

Я пытаюсь внедрить простую систему продуктов в MYSQL, где продукт может иметь много комментариев. В таблице комментариев есть внешний ключ product_id, ссылающийся на таблицу продуктов. Я хочу сохранить количество комментариев к товару в виде поля в таблице товаров для сортировки. Этого можно достичь, создав два триггера в таблице комментариев, например:

DELIMITER $$
CREATE TRIGGER comment_incr_trig
AFTER INSERT ON `COMMENT` FOR EACH ROW
begin
    UPDATE PRODUCT SET NUM_OF_COMMENT = NUM_OF_COMMENT + 1 WHERE ID = NEW.PRODUCT_ID;
END;
$$
DELIMITER ;
DELIMITER $$
CREATE TRIGGER comment_decr_trig
AFTER DELETE ON `COMMENT` FOR EACH ROW
begin
    UPDATE PRODUCT SET NUM_OF_COMMENT = NUM_OF_COMMENT - 1 WHERE ID = OLD.PRODUCT_ID;
END;
$$
DELIMITER ;

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

Большое спасибо.

1 Ответ

0 голосов
/ 18 февраля 2020

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

Чтобы избежать повторного ввода одного и того же запроса, одним из решений будет создание представления:

create view product_view(id, num_of_comments) as
select
    p.id,
    c.num_of_comments
from product p
left join (
    select product_id, count(*) num_of_comments
    from comment
    group by product_id
) c on c.product_id = p.id

Вы можете расширить представление, добавив больше столбцов из таблицы product (I не удалось добавить больше, поскольку в вашем вопросе отображается только столбец product(id)).

...