Sql server 通用SQL Server查询性能

Sql server 通用SQL Server查询性能,sql-server,linq-to-sql,Sql Server,Linq To Sql,这可能很愚蠢,但数据库不是我的专长:想象一下下面的场景。一个用户可以创建一个帖子,其他用户可以回复他的帖子,从而形成一个线程。所有内容都放在一个名为Posts的表中。构成线程的所有帖子都通过一个名为ThreadID的生成键相互连接。这意味着当用户1创建一篇新文章时,会生成一个ThreadID,随后的每个回复都有一个ThreadID,指向用户1创建的初始文章。我想做的是将回复数量限制在每个线程20条。我想知道下面哪种方法更快: 1. 我在POST中添加了一个新的整数列e.x.计数器。用户回复初始帖

这可能很愚蠢,但数据库不是我的专长:想象一下下面的场景。一个用户可以创建一个帖子,其他用户可以回复他的帖子,从而形成一个线程。所有内容都放在一个名为Posts的表中。构成线程的所有帖子都通过一个名为ThreadID的生成键相互连接。这意味着当用户1创建一篇新文章时,会生成一个ThreadID,随后的每个回复都有一个ThreadID,指向用户1创建的初始文章。我想做的是将回复数量限制在每个线程20条。我想知道下面哪种方法更快:

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

2. 用户回复初始帖子后,我选择所有具有相同ThreadID的帖子。如果此集合有20个以上的项,我将锁定线程

更多信息:我正在使用SQLServer数据库和LINQtoSQL实体模型。 如果你能告诉我你对这两种方法的看法,或者分享另一种更快的方法,我会很高兴

致以最良好的祝愿


Kiril

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

在我看来,这个回复计数器不是帖子的一部分,也不是线程。这是一个系统参数,可以放入另一个数据表中。为了这个例子,让我们称之为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表中加载一次此参数,如果回答数等于此参数值,则锁定

为什么SpValue字段使用nvarchar20

因为这样做,您还可以使用一些其他参数,这些参数将由字符串值组成


至于获取这些值,您应该编写一个GetParameterValue函数,该函数将根据函数调用中指定的SpTableName和SpName返回SpValue字段的值。通过这种方式,您还可以为同一个表使用其他参数,用于不同的目的。

已经在那里使用过,并且已经完成了这两种解决方案的变体

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

我通常以

3. 创建两个表,一个用于线程启动器,一个用于POST线程回复

通常你会发现,对于一个线程来说,字段比一篇文章要多。例如,您可以向Threads表中添加一列IsLocked。这样,您就不必记住神奇的数字20,就可以知道线程是否已锁定

我经常也有一个标题的线程,但不是为职位。有时还需要另一个专栏来了解线程是否有问题。等等