Можно ли в таблице сущности хранить информацию о колличестве ссылающихся сущностей?
Вот например есть таблица с товарами. Есть пользователи, которые могут писать на эти товары свои отзывы. Предположим, что количество пользователей растет каждый день на 100..200 штук и оставляют они все больше и больше отзывов по 500..10000 в день.
Так вот, если раньше мы вытаскивали из таблицы отзывов количество отзывов к товару (т.е. один запрос с выбором товара, еще один с количеством отзывов для него), то теперь есть идея сделать просто доп. колонку для товара с именем "qty_reviews" типа целочисленное и там обновлять счетчик после каждого добавления или удаления отзыва (добавился отзыв к товару, увечили qty_reviews). Например таблица будет такой
--------------------------------
| id | name | qty_reviews |
--------------------------------
Пример немного абстрактный, пример с цифрами хочу подчеркнуть высоконагруженность проекта (т.е. планируются такие нагрузки). База сейчас используется mysql (в дальнейшем будет еще Cassandra)
Можно ли создавать такие колонки для товара, которые будут постоянно обновляться?
У меня есть подозрение что такими запросами можно или убить базу или созадать коллизию при записи\выдаче
Ну чтобы не убить базу и не создавать коллизии существует инструкция WITH NOLOCK
MySQL NOLOCK syntax is equivalent to WITH (NOLOCK) in SQL Sever, and it is a transaction isolation level that defines how data is available during an update. With other words, it is a property that defines at what point changes made by an update operation will become available in a row, table or database to requesting processes.
По поводу денормализации - могу вам предложить сделать таблицу ReviewsCounts где хранить id товара и число отзывов. Соответственно вы не будете грузить триггерами таблицу самих товаров. Можете сделать парный ключ idтовара/номер отзыва и число отзывов делать через группировку id товара и MAX(номера отзыва).
А что, просто добавить индекс на поле идентификатора товара недостаточно?
Насколько я понимаю, при его наличии запрос на количество строк с таким индексом базу практически не напрягает.
Или я ошибаюсь?
нет, все верно, mysql отлично работает с индексами. Я привел тут самый простейший пример. На самом деле же планируется реализовать задачки посложнее, например, хранить цены