ASP.NET和SQL Server中的注释编号

ASP.NET和SQL Server中的注释编号,asp.net,sql-server,linq,database-design,comments,Asp.net,Sql Server,Linq,Database Design,Comments,根据这篇文章,我刚刚考虑了用适当的数字在数据库中存储评论的最佳方法 其思想是使用复合主键commentId和articleId存储注释,其中commentId是根据给定的articleId生成的。生成系统应具有与SQL Server中标识生成列相同的原理,因为如果有人删除注释,则该编号将不再使用。我想Microsoft SQL Server中没有任何功能可以通过复合PK实现这一点,所以我想问一下这个解决方案的替代品 第一个想法是使用transaction获取MAXcommentId+1,但我正在

根据这篇文章,我刚刚考虑了用适当的数字在数据库中存储评论的最佳方法

其思想是使用复合主键commentId和articleId存储注释,其中commentId是根据给定的articleId生成的。生成系统应具有与SQL Server中标识生成列相同的原理,因为如果有人删除注释,则该编号将不再使用。我想Microsoft SQL Server中没有任何功能可以通过复合PK实现这一点,所以我想问一下这个解决方案的替代品


第一个想法是使用transaction获取MAXcommentId+1,但我正在寻找一些更抽象的东西,也许可以代替触发器,例如在LINQ中使用,而不需要了解背景,只需将所有必需的值插入到相应的表中,这样就没有commentId并保存它。

我会使用标识列作为注释的键,为什么需要为存储在数据库中的注释编号?

我会使用标识列作为注释的键,为什么需要为存储在数据库中的注释编号?

我会使用自动生成的标识列作为注释ID,并将其单独作为主键。我会在articleId上创建一个索引以进行查找。我还将创建一个在插入时自动填充当前日期的createdDate列,将其标记为db generated,并在LINQ中只读,这样它就不需要或尝试插入/更新该值。要获得编号-如果按日期显示还不够-我会按createdDate反向排序,并在select using Row_Number(使用行编号)中指定一个数值或在客户端指定一个编号。

我会使用自动生成的标识列作为commentId,并将其单独作为主键。我会在articleId上创建一个索引以进行查找。我还将创建一个在插入时自动填充当前日期的createdDate列,将其标记为db generated,并在LINQ中只读,这样它就不需要或尝试插入/更新该值。要获得编号-如果按日期显示还不够-我会按createdDate逆序排序,并使用行号或客户端的编号在select中指定一个数值。

感谢您的回复,我想要一些带有编号注释的内容,因为注释文本中有引用。我不想通过名字来做出反应,有时一个人会做出更多的反应,所以有了这个系统,我就知道这个人在回答哪一个了

所以今天我制作了这个而不是插入触发器:

CREATE TRIGGER InsertComments ON Comments
INSTEAD OF INSERT
AS
DECLARE @Inserted TABLE
(
    ArticleId INT NOT NULL,
    UserId INT NOT NULL,
    CommentDate DATETIME NOT NULL,
    Content NVARCHAR(1000) NOT NULL,
    RowNumber INT NOT NULL
)
INSERT INTO @Inserted
SELECT ArticleId, UserId, CommentDate, Content, ROW_NUMBER() OVER (ORDER BY CommentDate) AS RowNumber
FROM INSERTED
DECLARE @NumberOfRows INT = (SELECT COUNT(*) FROM @Inserted)
DECLARE @i INT = 1
WHILE (@i <= @NumberOfRows)
BEGIN
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
    BEGIN TRAN
    DECLARE @CommentId INT = (SELECT ISNULL(MAX(CommentId), 0)
        FROM Comments WHERE ArticleId = (SELECT ArticleId
            FROM @Inserted WHERE RowNumber = @i)) + 1
    INSERT INTO Comments(CommentId, ArticleId, UserId, CommentDate, Content)
    SELECT @CommentId, ArticleId, UserId, CommentDate, Content
    FROM @Inserted WHERE RowNumber = @i
    COMMIT
    SET @i = @i + 1
END

我知道这不是一个完美的解决方案,但它正是我所需要的。如果你们中有人有意见,我很乐意阅读。

谢谢你们的回复,我想要一些带有编号的意见,因为在意见文本中有引用。我不想通过名字来做出反应,有时一个人会做出更多的反应,所以有了这个系统,我就知道这个人在回答哪一个了

所以今天我制作了这个而不是插入触发器:

CREATE TRIGGER InsertComments ON Comments
INSTEAD OF INSERT
AS
DECLARE @Inserted TABLE
(
    ArticleId INT NOT NULL,
    UserId INT NOT NULL,
    CommentDate DATETIME NOT NULL,
    Content NVARCHAR(1000) NOT NULL,
    RowNumber INT NOT NULL
)
INSERT INTO @Inserted
SELECT ArticleId, UserId, CommentDate, Content, ROW_NUMBER() OVER (ORDER BY CommentDate) AS RowNumber
FROM INSERTED
DECLARE @NumberOfRows INT = (SELECT COUNT(*) FROM @Inserted)
DECLARE @i INT = 1
WHILE (@i <= @NumberOfRows)
BEGIN
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
    BEGIN TRAN
    DECLARE @CommentId INT = (SELECT ISNULL(MAX(CommentId), 0)
        FROM Comments WHERE ArticleId = (SELECT ArticleId
            FROM @Inserted WHERE RowNumber = @i)) + 1
    INSERT INTO Comments(CommentId, ArticleId, UserId, CommentDate, Content)
    SELECT @CommentId, ArticleId, UserId, CommentDate, Content
    FROM @Inserted WHERE RowNumber = @i
    COMMIT
    SET @i = @i + 1
END

我知道这不是一个完美的解决方案,但它正是我所需要的。如果你们中有人有意见,我很乐意阅读。

由于每篇文章中都有编号的意见,因此更容易对具体的意见作出回应,并将这些反应保存在文本中。它们可以链接到身份栏。这是一个务实的答案,tvanfosson的答案也是如此。你的跳跃只是为了模仿db中已有的功能。如果您担心可用性,请在用户界面中为用户提供他们所需的工具,不要强迫人们学习您的wiki、bbcode、论坛、标记语法。因为每篇文章中的注释都有编号,对具体评论的回应会更容易,并将这些反应保存在文本中。它们可以链接到身份栏。这个答案是务实的,tvanfosson的答案也是如此。你的跳跃只是为了模仿db中已有的功能。如果你担心可用性,给人们提供他们在UI中需要的工具,不要强迫人们学习你的wiki、bbcode、论坛、标记语法。是的,这可能是一个很好的解决方案,但我错过了一件事。一条评论可以对另一条评论作出反应,例如在评论文本中键入[12]reaction、[32]reaction。如果管理员删除了第6条评论,这些反应将是错误的。@Nizdo-就我个人而言,我不会给它们编号。我有日期和名字。同样,当您引用另一条注释时,典型的方法是使用@name并给出上下文。或者你也可以使用像reddit这样的分层评论,在这里可以留下评论作为评论。是的,这可能是一个很好的解决方案,但我错过了一件事。一条评论可以对另一条评论作出反应,例如在评论文本中键入[12]reaction、[32]reaction。如果管理员删除了第6条评论,这些反应将是错误的。@Nizdo-就我个人而言,我不会给它们编号。我已经拿到了 e和姓名。同样,当您引用另一条注释时,典型的方法是使用@name并给出上下文。或者,您也可以使用分层注释(如reddit),其中可以留下注释作为注释。