Подсчет количества комментариев / сообщений - PullRequest
3 голосов
/ 02 мая 2009

Я использую ASP.net и базу данных SQL. У меня есть система, похожая на блог, в которой к сообщению делается несколько комментариев, и я хочу отобразить количество этих комментариев рядом с сообщением. Чтобы получить это число, я мог бы либо удерживать его в записи поста, либо добавлять / вычитать при добавлении или удалении комментария, либо использовать SQL для вычисления количества комментариев, используя запрос каждый раз, когда пользователь заходит на страницу. Последнее кажется плохой идеей, так как оно будет сильнее ударять по моей базе данных SQL, однако, удерживая число против записи, я чувствую, что оно может быть подвержено ошибкам. Как вы думаете, что является лучшей практикой кодирования в этом случае?

Ответы [ 9 ]

3 голосов
/ 02 мая 2009

Всегда начинайте с нормализованной базы данных (ваш второй вариант). Только денормализуйте, если у вас есть абсолютная необходимость по причинам производительности. Разработка его денормализованным способом (который, как вы уже догадались) подвержен ошибкам, является преждевременной оптимизацией. С правильными индексами все должно быть хорошо, рассчитывая число на лету.

2 голосов
/ 02 мая 2009

Не оптимизируйте преждевременно. Используйте простое решение и страницу с ошибками при оптимизации только тогда, когда они необходимы.

2 голосов
/ 02 мая 2009

Я думаю, что оператор SQL должен быть в порядке. Другое - дублирование данных, которые у вас уже есть. Запрос на подсчет должен быть быстрым.

1 голос
/ 15 июля 2012

Чтобы повысить производительность, вы можете оставить флажок в главной таблице, чтобы указать, есть ли у элемента какие-либо комментарии, но использовать это только как «подсказку» о том, выполнять или нет дополнительный запрос для подсчета и получения комментариев в позже.

Представьте себе фотогалерею, которая возвращает 50 фотографий для поворота. Каждая фотография может иметь свои комментарии.

При начальной загрузке страницы возвращается список фотографий и флаг, указывающий, есть ли на фотографии комментарии.

При отображении фотографии, если флаг комментариев установлен в True, ваше приложение будет отправлять ajax-запрос для подсчета и получения комментариев к этой фотографии.

Если только 3 из 50 фотографий имеют комментарии, вы только что сэкономили 47 дополнительных запросов!

Это денормализует данные, но на ограниченном уровне. Создание подсказок действительно может помочь повысить производительность очень загруженных сайтов.

1 голос
/ 02 мая 2009

Возможно, вернуть счет как часть запроса основного потока, чтобы ограничить количество обращений к фактической БД с веб-сервера. Но я всегда запрашиваю фактическое количество и не пытаюсь держать его в поле, данные в конечном итоге будут синхронизированы, поскольку это реальность.

1 голос
/ 02 мая 2009

Я бы запрашивал базу данных каждый раз, когда вам нужна информация. Я хотел бы вернуться к нему позже, если вы обнаружите, что производительности не хватает (оптимизировать позже). Для трафика, который получат большинство приложений типа блога, этого должно быть достаточно.

0 голосов
/ 02 мая 2009

Я обычно использую индексированное представление для такого рода вещей. Это позволяет вам денормализовать данные для быстрого поиска, но у них нет возможности выйти из синхронизации. Люди также не будут смущены и думают, что представление является хозяином данных. В основном я использовал стандартный sku SS2K5, поэтому мне нужно указать подсказку (noexpand), чтобы он фактически использовал индекс в представлении (предприятие сделает это автоматически). Таким образом, для стандартного sku я всегда создаю представление обертки, к которому обращаются все, поэтому я знаю, что подсказка всегда на месте.

Кодирование этого на веб-странице, так что, надеюсь, нет синтаксических ошибок;)

create view postCount__
as
select
    threadId
    ,postCount=count_big(*)
from thread
group by threadId
go
create unique clustered index postCount__xpk_threadid on postCount__(threadId)
go
create view postCount
as
select
    threadId
    ,postCount=cast(postCount as int)
from postCount__ with (noexpand)
go

Таким образом, я использую номенклатуру в фактическом индексированном представлении, чтобы все знали, чтобы не запрашивать его напрямую. Вместо этого они ищут связанный вид оболочки, который применяет подсказку noexpand. Использование индексированного представления вынуждает вас делать count_big, поэтому я часто обращаюсь к int в представлении оболочки, чтобы иметь возможность лениво сохранять наш код asp.net, используя 32-битные числа. Было бы лучше опустить актерский состав, но это не оказало для меня существенного влияния.

РЕДАКТИРОВАТЬ - Я могу вам сказать, что программное обеспечение форума всегда денормализует количество сообщений в таблице потоков. Это убивает БД, чтобы постоянно подсчитывать количество сообщений на каждом просмотре страницы, если у вас есть активный форум. Мне нравится, что в mssql есть индексированные представления, поэтому вы можете декларативно определять денормализацию, а не поддерживать ее самостоятельно.

0 голосов
/ 02 мая 2009

Кэширование страниц и обновление этого кеша при добавлении / удалении комментариев было бы хорошим вариантом, если с запросом подсчета SQL беспокоиться о количестве запросов к базе данных.

0 голосов
/ 02 мая 2009

В зависимости от того, как выглядит ваша модель данных ... Не добавляйте общее количество сообщений в основную запись потока, оно подвержено ошибкам, при необходимости следует рассчитывать количество комментариев на основе идентификатора потока, IMHO

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...