【问题标题】:Numbering comments in ASP.NET and SQL ServerASP.NET 和 SQL Server 中的注释编号
【发布时间】:2009-02-17 19:08:17
【问题描述】:

根据文章,我刚刚考虑了将 cmets 存储在具有适当数字的数据库中的最佳方法。

这个想法是用复合主键(commentId,articleId)存储cmets,其中commentId是根据给定的articleId生成的。生成的系统应该和SQL Server中IDENTITY生成列的原理一样,因为如果有人删除了评论,这个数字就再也不会被使用了。我想 Microsoft SQL Server 中没有任何功能可以使用复合 PK 来做到这一点,所以我想问一下这个解决方案的一些替代品。

首先想到的是使用事务来获取 MAX(commentId) + 1,但我正在寻找更抽象的东西(可能是 INSTEAD OF 触发器),例如可以在不了解背景的情况下在 LINQ 中使用的东西,只是将所有必需的值(所以没有 commentId)插入到相应的表中并保存。

【问题讨论】:

    标签: asp.net sql-server linq database-design comments


    【解决方案1】:

    我会为 commentId 使用一个自动生成的标识列,并让它单独作为主键。我会在 articleId 上创建一个索引以进行查找。我还会在插入时使用当前日期自动填充 createdDate 列——在 LINQ 中将其标记为 db 生成和只读,因此它不需要或尝试插入/更新值。要获得编号——如果按日期显示它们还不够——我会按 createdDate 倒数排序,并在选择中使用 Row_Number() 或在客户端分配一个数字值。

    【讨论】:

    • 是的,这可能是一个很好的解决方案,但我错过了一件事。一条评论可以对另一条评论做出反应,例如在评论文本中键入“[12] 反应,[32] 反应”。如果管理员删除第 6 条评论,这些反应将是错误的。
    • @Nizdo -- 就个人而言,我不会给它们编号。我有他们的日期和名字。与 SO 一样,当您参考另一条评论时,典型的做法是使用 @name 并给出上下文。或者您可以使用分层 cmets(如 reddit),其中可以留下评论以供评论。
    【解决方案2】:

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

    【讨论】:

    • 因为每篇文章都对cmet进行了编号,回复具体评论会更容易,并将这些反应保存在文中。
    • 它们可以链接到身份列。
    • 这个答案是务实的,tvanfosson 的也是如此。您跳过箍只是为了模仿数据库中已经存在的功能。如果您担心可用性,请在 UI 中为人们提供他们需要的工具,不要强迫人们倾向于使用您的 wiki、bbcode、论坛、标记语法。
    【解决方案3】:

    感谢您的回复,由于在 cmets 的文本中引用,我想要带有编号 cmets 的东西。我不想通过名字做出反应,有时一个人反应更多次,所以有了这个系统,我会知道这个人在回复哪一个。

    所以今天我制作了这个 INSTEAD OF INSERT 触发器:

    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
    

    我知道这不是完美的解决方案,但它完全符合我的需要。如果你们中的任何人有一些 cmets,我会很乐意阅读它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-22
      • 1970-01-01
      • 2012-06-09
      • 1970-01-01
      • 2016-04-03
      • 1970-01-01
      • 2021-06-06
      • 1970-01-01
      相关资源
      最近更新 更多