0

記事に従って、コメントを適切な数でデータベースに保存する最良の方法を考えました。

アイデアは、指定された articleId に従って commentId が生成される複合主キー (commentId、articleId) を使用してコメントを格納することです。生成のシステムは、SQL Server の IDENTITY 生成列と同じ原則を持つ必要があります。誰かがコメントを削除すると、その番号は二度と使用されなくなるからです。Microsoft SQL Server には、複合 PK でそれを行う機能はないと思います。そのため、このソリューションの代替品について質問しています。

最初に考えたのは、トランザクションを使用して MAX(commentId) + 1 を取得することでしたが、より抽象的なもの (おそらく INSTEAD OF トリガー) を探しています。たとえば、背景の知識がなくても LINQ で使用できるものを、適切なテーブルに必要なすべての値 (したがって、commentId はありません) を作成して保存します。

4

3 に答える 3

1

コメントのキーとして ID 列を使用しますが、データベースに保存されているコメントに番号を付ける必要があるのはなぜですか?

于 2009-02-17T19:16:53.717 に答える
0

コメントのテキストで参照しているため、番号付きのコメントが必要でした。名前でリアクションしたくありませんでした。一人の人が何度もリアクションすることもあるので、このシステムでは、その人が誰にリアクションしているかを知ることができます。

だから今日、私はこの 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

これが完璧な解決策ではないことはわかっていますが、必要に応じて正確に機能します。どなたかコメントがあれば、喜んで読ませていただきます。

于 2009-02-18T19:12:42.857 に答える