Нумерация комментариев в ASP.NET и SQL Server - PullRequest
0 голосов
/ 17 февраля 2009

Я только что подумал о лучшем способе хранения комментариев в базе данных с соответствующими номерами согласно статье.

Идея состоит в том, чтобы хранить комментарии с составным первичным ключом (commentId, articleId), где commentId генерируется в соответствии с заданным articleId. Система генерации должна иметь тот же принцип, что и колонки, генерируемые IDENTITY в SQL Server, потому что, если кто-то удалит комментарий, этот номер никогда не будет использоваться снова. Я полагаю, что в Microsoft SQL Server нет никакой функциональности, позволяющей делать это с композитным PK, поэтому я прошу о некоторой замене этого решения.

Первой мыслью было использовать транзакцию для получения MAX (commentId) + 1, но я ищу что-то более абстрактное (возможно, триггер INSTEAD OF), что-то, что можно было бы использовать, например, в LINQ без знания фона, просто вставьте в соответствующую таблицу все необходимые значения (без комментариев) и сохраните его.

Ответы [ 3 ]

2 голосов
/ 17 февраля 2009

Я бы использовал автоматически сгенерированный столбец идентификаторов для commentId, и он был бы только первичным ключом. Я бы создал индекс для articleId для поиска. Я также хотел бы иметь столбец createDate, который автоматически заполняется текущей датой при вставке - пометьте его как db, сгенерированный и только для чтения в LINQ, чтобы он не требовал или пытался вставить / обновить значение. Чтобы получить нумерацию - если показывать их по дате недостаточно - я бы заказал с помощью инвертированного createDate и присвоил бы числовое значение в выборе, используя Row_Number () или нумерацию на стороне клиента.

1 голос
/ 17 февраля 2009

Я бы использовал идентификационный столбец в качестве ключа для комментариев, зачем вам нумерация комментариев, хранящихся в базе данных?

0 голосов
/ 18 февраля 2009

Спасибо за ответы, я хотел что-то с пронумерованными комментариями из-за ссылок в тексте комментариев. Я не хотел давать реакции по именам, иногда один человек реагирует больше раз, поэтому с помощью этой системы я буду знать, на какую систему отвечает человек.

Итак, сегодня я составил этот триггер 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

Я знаю, что это не идеальное решение, но оно работает именно так, как мне было нужно. Если у кого-нибудь из вас есть какие-то комментарии, я буду рад их прочитать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...