在SQL中维护元数据表

时间:2009-12-22 16:43:26

标签: sql sql-server stored-procedures

有人可以帮我一些方向来解决这样的情况。 User表是包含所有用户信息的User表,是User Table上的主键。我有另一个名为Comments的表,它包含任何用户创建的所有注释。注释表包含UserID作为外键。现在我必须根据用户添加的评论数量对用户进行排名。用户添加的评论越多,排名就越高。我试图看看这将是最好的方法。

我更希望有另一个表,它基本上包含用户的所有属性或统计信息(将来可能有更多属性,现在只有排名,基于注释计数),而不是在User表本身中添加另一列。

如果我创建另一个名为UserStats的表,并将UserID作为外键,并且有另一个名为Rank的列,则每次用户添加注释时都有可能需要更新排名。我怎么写这样做的SP,我甚至不确定,如果这是正确的方法。

4 个答案:

答案 0 :(得分:2)

这不是正确的方法。

在出现性能问题之前,您不希望实现这些类型的计算值 - 并且您可以使用索引视图等选项在您达到建议的目的之前帮助您。

只需创建一个名为UserRankings的视图,其外观如下:

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

不确定如何进行排名,但您也可以查看T-SQL中的RANK()和DENSE_RANK()函数:Ranking Functions (Transact-SQL)

答案 1 :(得分: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

答案 2 :(得分:0)

存储这类信息实际上是一个坏主意。每个用户的评论数量可以在任何给定时间快速轻松地计算。如果您的列被正确编入索引(在外键上),则计数操作应该非常快。

您可能希望保留元数据的唯一原因是数据库上的负载是快速而激烈的,并且您根本无法负担运行具有每个请求计数的选择查询。并且该加载还将通知您是仅向用户表添加列还是创建整个单独的表。 (后一种解决方案是最极端服务器负载的解决方案。)

答案 3 :(得分:-1)

一些评论:

是的,我认为您应该在某处保留“得分”元数据,否则,您每次都必须运行评分计算,这最终会变得昂贵。

其次,我认为你不应该计算一个实际的“排名”(与其他用户相比)。只需计算“得分”(根据发布的评论数量),然后您的查询可以通过按降序检索得分来确定“排名”。

第三,根据每个插入到评论表中的内容,我可能会触发更新元数据表中的“得分”。