Обновление
не лучше ли иметь столбец с именем NumberOfLikes в таблице «Продукт» для хранения рассчитанного количества лайков продукта?
ИМХО, прямой ответ на этот вопрос: «Нет, если у вас нет реальной проблемы с производительностью из-за подсчета лайков».
Если у вас есть проблема с производительностью, и вы определили ее источник как количество лайков, то вы можете рассмотреть возможность добавления столбца LikesCount
в таблицу products
. Если вы добавите такой столбец, обратите внимание, что вам придется обновлять его при каждом изменении таблицы ProductLike
- удалять, обновлять и вставлять.
Это означает, что вам нужно написать триггер для этой таблицы, чтобы обработать все эти случаи, но это не должно быть слишком сложно, так как вы можете делать все за один триггер - что-то вроде этого:
create trigger ProductLikeChaneged on ProductLike
for insert, update, delete
as
update p
set LikesCount = (select count(*) from ProductLike as pl where pl.productId = p.Id)
from product as p
where exists
(
select 1 from inserted as i where p.id = i.productId
)
or exists
(
select 1 from deleted as d where p.id = d.productId
)
Оригинальная версия
Исходя из вашего описания, «вычисление» количества лайков для продукта - это просто количество строк в таблице ProductLike
, где id продукта - это идентификатор продукта, который вы в данный момент отображаете для пользователя.
Это можно сделать очень быстро, особенно если кластеризованный индекс таблицы ProductLike
равен ProductId
, а затем UserId
, что позволяет SQL Server использовать поиск кластеризованного индекса, а не сканирование таблицы.
По сути, ваша таблица ProductLike
должна выглядеть следующим образом:
Create table ProductLike
(
ProductId int,
UserId int,
Constraint PK_ProductLike PRIMARY KEY (ProductId, UserId)
)
Обратите внимание, что по умолчанию SQL Server будет использовать первичный ключ в качестве кластеризованного индекса таблицы.
Тогда ваш оператор выбора для страницы продукта может выглядеть примерно так:
select Name, Description, -- Other product related details
(select count(*)
from productLike as pl
where pl.ProductId = p.Id) as likeCount
from product as p