Это, как и большинство вещей, зависит от шаблонов доступа, то есть от того, как будет использоваться ваша система.Если обновление будет вашим главным узким местом, то вам не следует брать на себя дополнительные накладные расходы из-за необходимости поддерживать счетчик.Если, с другой стороны, при доступе к данным с готовым подсчетом вы сэкономите значительное время или просто будет невозможно проводить подсчет каждый раз, то вам следует предварительно рассчитать его.
Как общее руководство, не добавляйте таблицы, такие как отдельная таблица подсчета, которую вы предлагаете, которые предназначены исключительно для оптимизации производительности, прежде чем вы фактически измерили производительность как проблему.Наличие отдельной таблицы счетчиков нарушает нормализацию (как это делает любой вид кэширования, поскольку данные теперь реплицируются в двух местах) и усложняет код, поэтому делать это не следует только потому, что может потребоваться счет.
(При всем этом некоторые базы данных поддерживают материализованные представления / материализованные запросы , которые позволяют легко прозрачно выполнять этот вид кэширования в фоновом режиме. Эти материализованные таблицы обновляются базой данных, поэтому программный кодне нужно беспокоиться об этом, а также, в зависимости от сложности оптимизатора запросов, может использоваться для прозрачной оптимизации запроса.)
Обновление: Вопрос для голосования "Нет / Да"немного по-другому, так как основная цель состоит в том, чтобы просто отслеживать количество, а не обязательно всю информацию (то есть кто проголосовал за).Таким образом, правильной реализацией может быть просто отслеживать накопленное количество голосов «за» и «нет».Тем не менее, чем больше информации вы храните (то есть, кто проголосовал «за», а не только за многих), тем больше вы можете сделать с ней, если вы решите это сделать (например, в Stackoverflow я всегда могу удалить свое upvote - то, что вы не сможете сделать, еслиты не отслеживал кто голосовал).Опять же, в этом случае я бы советовал не агрегировать на ранней стадии, потому что вы потеряете определенную информацию.