一般SQL Server查询性能

时间:2010-06-01 12:32:07

标签: sql-server linq-to-sql

这可能是愚蠢的,但数据库不是我的事情:)想象一下以下场景。用户可以创建帖子,其他用户可以回复他的帖子,从而形成一个帖子。一切都在一个名为Posts的表中。形成线程的所有帖子通过名为ThreadID的生成密钥相互连接。这意味着当用户#1创建新帖子时,会生成一个ThreadID,并且后面的每个回复都有一个指向初始帖子的ThreadID(由用户#1创建)。我想要做的是限制回复的数量让每个线程说20个。我想知道哪种方法更快:

1

我在帖子中添加了一个新的整数列(e.x. Counter)。在用户回复初始帖子后,我更新了初始帖子的Counter字段。如果它达到20我锁定线程。

2

用户回复初始帖子后,我选择所有具有相同ThreadID的帖子。如果此集合有超过20个项目,我会锁定该线程。

有关详细信息:我正在使用SQL Server数据库和Linq-to-SQL实体模型。 如果你告诉我你对这两种方法的看法或分享另一种更快的方法,我会很高兴。

最诚挚的问候,

基里尔

3 个答案:

答案 0 :(得分:1)

去过那里并且已经完成了两种解决方案的变体。

我个人不喜欢解决方案1,因为计数器列对所有回复帖子都没有任何意义。

我通常以

结束

3

创建两个表,一个用于Threads(线程启动器),另一个用于Posts(线程回复)。

通常你会发现,对于线程,有更多的字段而不是帖子。例如,您可以向Threads表添加列IsLocked。然后,您将不必记住幻数(20)以了解线程是否被锁定。

我经常也有一个Title的帖子,但不是帖子。有时候另一列知道线程IsSticky是否成立。等等...

答案 1 :(得分:0)

只要您在ThreadID上有索引,选项2就可以了。 选项1也没问题(假设你有一个关于ThreadID的索引),但我认为代码会更复杂。

答案 2 :(得分:0)

在我看来,这个回复计数器不是帖子的一部分,也不是一个帖子。这是一个适合另一个数据表的系统参数。为了这个例子,我们称之为SysParams。

CREATE TABLE SysParams (
    SpId int IDENTITY(1, 1) primary key
    , SpTableName nvarchar(20) NOT NULL -- To what table this parameter applies?
    , SpName nvarchar(10) NOT NULL  -- Parameter name
    , SpValue nvarchar(20) NOT NULL -- Value of the parameter
)

insert into SysParams (SpTableName, SpName, SpValue) values (N'Posts', N'MaxAnswersPerThread', N'20')
GO

然后,在加载帖子或帖子时,你只需从SysParams表加载一次此参数,如果答案数等于此参数值,则锁定。

  

为什么 nvarchar(20) SpValue 字段?

因为这样做,你可能还有其他一些由字符串值组成的参数。

至于获取这些值,你应该编写一个 GetParameterValue()函数,该函数只返回 SpValue 字段的值,具体取决于 SpTableName SpName 。这样,您可能还有同一个表的其他参数用于不同的目的。