2009-12-22 3 views
0

Может кто-то помочь мне дать мне какое-то направление для решения такого сценария. Таблица пользователей, которая содержит всю информацию о пользователе, UserID является первичным ключом в таблице пользователей. У меня есть другая таблица, называемая, например, Комментарии, в которой хранятся все комментарии, созданные любым пользователем. Таблица комментариев содержит UserID как внешний ключ. Теперь я должен оценивать пользователей на основе количества комментариев, которые они добавили. Чем больше комментариев добавлен пользователь, тем выше рейтинг. Я пытаюсь понять, что будет лучшим способом сделать это.Ведение таблицы метаданных в SQL

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

Если я создаю другую таблицу, названную UserStats и имею пользовательский идентификатор в качестве внешнего ключа, а также имеет другой столбец под названием Rank, существует вероятность, что каждый раз, когда пользователь добавляет комментарий, нам может потребоваться обновить ряды. Как написать SP, который делает это, я даже не уверен, если это правильный способ сделать это.

ответ

1

Вы можете сделать это из запроса

SELECT UserID, 
    COUNT(UserID) CntOfUserID 
FROM UserComments 
GROUP BY UserID 
ORDER BY COUNT(UserID) DESC 

Вы также могли бы сделать это с помощью ROW_NUMBER

DECLARE @Comments TABLE(
     UserID INT, 
     Comment VARCHAR(MAX) 
) 

INSERT INTO @Comments SELECT 3, 'Foo' 
INSERT INTO @Comments SELECT 3, 'Bar' 
INSERT INTO @Comments SELECT 3, 'Tada' 

INSERT INTO @Comments SELECT 2, 'T' 
INSERT INTO @Comments SELECT 2, 'G' 


SELECT UserID, 
     ROW_NUMBER() OVER (ORDER BY COUNT(UserID) DESC) ID 
FROM @Comments 
GROUP BY UserID 
0

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

Единственная причина, по которой вы, возможно, захотите сохранить метаданные, - это то, что загрузка в вашей базе данных происходит быстро и в ярости, и вы просто не можете позволить себе запускать запросы с подсчетами на запрос. И эта загрузка также сообщит, просто ли добавить столбец в свою пользовательскую таблицу или создать целую отдельную таблицу. (Последнее решение является одним из самых экстремальных серверных нагрузок.)

2

Это неправильный способ сделать это.

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

Просто создать представление называется UserRankings и он выглядит следующим образом: функции

SELECT c.UserId, COUNT(c.CommentId) [Ranking] 
FROM Comments c 
GROUP BY c.UserId 

Не знаю, как вы хотите сделать свой рейтинг, но вы также можете посмотреть на RANK() и DENSE_RANK() в T -SQL: Ranking Functions (Transact-SQL)

-1

несколько комментариев:

Да, я думаю, вы должны держать «забьет» метаданные где-то, в противном случае вам придется запустить Скоринг Calc каждый раз, что в конечном счете может дорого обойтись.

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

В-третьих, я бы, вероятно, сделал триггер, который обновляет «оценку» в таблице метаданных на основе каждой вставки в таблицу комментариев.

+2

Материализация расчетных данных и использование триггеров - это непростые вещи. Я не думаю, что эти вычисления стоят так дорого, как вы думаете, и этот материал можно легко кэшировать на некоторый интервал на уровне презентации. –

Смежные вопросы