这可能是愚蠢的,但数据库不是我的事情:)想象一下以下场景。用户可以创建帖子,其他用户可以回复他的帖子,从而形成一个帖子。一切都在一个名为Posts的表中。形成线程的所有帖子通过名为ThreadID的生成密钥相互连接。这意味着当用户#1创建新帖子时,会生成一个ThreadID,并且后面的每个回复都有一个指向初始帖子的ThreadID(由用户#1创建)。我想要做的是限制回复的数量让每个线程说20个。我想知道哪种方法更快:
我在帖子中添加了一个新的整数列(e.x. Counter)。在用户回复初始帖子后,我更新了初始帖子的Counter字段。如果它达到20我锁定线程。
用户回复初始帖子后,我选择所有具有相同ThreadID的帖子。如果此集合有超过20个项目,我会锁定该线程。
有关详细信息:我正在使用SQL Server数据库和Linq-to-SQL实体模型。 如果你告诉我你对这两种方法的看法或分享另一种更快的方法,我会很高兴。
最诚挚的问候,
基里尔
答案 0 :(得分:1)
去过那里并且已经完成了两种解决方案的变体。
我个人不喜欢解决方案1,因为计数器列对所有回复帖子都没有任何意义。
我通常以
结束创建两个表,一个用于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 函数调用中指定了em>和 SpName 。这样,您可能还有同一个表的其他参数用于不同的目的。