SQL Server 2005: необходима базовая логика вставки / записи логики - PullRequest
1 голос
/ 12 августа 2010

Я проектирую сайт социальной сети, у которого есть функция "стены", как и у других сегодня. В базе данных есть таблица предупреждений, в которой хранятся некоторые действия пользователя, которыми стоит поделиться со своими друзьями. Например, когда пользователь обновляет свой статус, все его друзья получают уведомление. В таблице ниже показаны два обновления статуса от двух уникальных пользователей. Первый (AlertId 689 и 690) предоставляется AccountId 53. Поскольку у него есть один источник данных - AccountId 57 - эта строка добавляется в таблицу, поэтому, когда этот пользователь входит в систему, он увидит обновление учетной записи 53 на своей стене. Таким же образом, обновление статуса другого пользователя имеет четыре строки, потому что у него есть три друга.

[AlertId]  [AccountId]  [CreateDate] [Timestamp]    [AlertTypeId] [IsHidden] [Body] 

689        57       2010-08-10   0x0000000000018725      10          0    HTML
690        53       2010-08-10   0x0000000000018726      10          0    HTML

691        53       2010-08-10   0x000000000001872B      10          0    HTML
692        52       2010-08-10   0x000000000001872C      10          0    HTML
693        51       2010-08-10   0x000000000001872D      10          0    HTML
694        57       2010-08-10   0x000000000001872E      10          0    HTML

Теперь пользователь может комментировать любой данный элемент, в данном случае это обновление статуса. Когда отправляется AddComment , мы используем ObjectRecordId (который является первичным ключом комментируемого предупреждения), чтобы определить, какой статус обновляется за комментарий (fyi - objectId сообщает нам его statusupdate):

public void AddComment(string comment)
    {
        if (_webContext != null)
        {
            var c = new Comment
                        {
                            Body = comment,
                            CommentByAccountId = _webContext.CurrentUser.AccountId,
                            CommentByUserName = _webContext.CurrentUser.UserName,
                            CreateDate = DateTime.Now,
                            SystemObjectId = _view.ObjectId,
                            SystemObjectRecordId = _view.ObjectRecordId
                        };
            _commentRepository.SaveComment(c);
        }
        _view.ClearComments();
        LoadComments();
    }

Теперь проблема в том, что когда пользователь хочет прокомментировать обновление статуса друга, он будет использовать AlertId (или ObjectRecordId в таблице комментариев), соответствующий его учетной записи в таблице предупреждений. В результате комментарии видят только комментатор и никто из его друзей:

[CommentId]  [Body]  [CommentById] [CommentByName] [ObjectId] [ObjectRecordId] [Delete]
   97     hello world.    57          GrumpyCat        7           690           0

Конечно, решение этой проблемы - сделать что-то похожее на то, что я делал в таблице предупреждений - когда кто-то делает комментарий, создайте соответствующую строку для каждого друга в таблице комментариев. Но как мне получить доступ к AlertIds всех обновлений статуса моего друга в таблице Alerts и сопоставить их со столбцом ObjectRecordId в таблице комментариев? Поскольку я могу получить доступ только к обновлениям статуса, соответствующим моей учетной записи (и соответствующие оповещения), я не знаю, что это за оповещения о том же обновлении статуса в аккаунтах моего друга.

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

Для чего это стоит, вот CREATE TABLE dbo.Alerts:

CREATE TABLE [dbo].[Alerts](
    [AlertId] [bigint] IDENTITY(1,1) NOT NULL,
    [AccountId] [int] NOT NULL,
    [CreateDate] [datetime] NOT NULL CONSTRAINT [DF_Alerts_CreateDate]  DEFAULT (getdate()),
    [Timestamp] [timestamp] NOT NULL,
    [AlertTypeId] [int] NOT NULL,
    [IsHidden] [bit] NOT NULL CONSTRAINT [DF_Alerts_IsHidden]  DEFAULT ((0)),
    [Message] [varchar](max) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
 CONSTRAINT [PK_Alerts] PRIMARY KEY CLUSTERED 
(
    [AlertId] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

А, вот dbo.Comments:

CREATE TABLE [dbo].[Comments](
    [CommentId] [bigint] IDENTITY(1,1) NOT NULL,
    [Timestamp] [timestamp] NOT NULL,
    [Body] [varchar](2000) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
    [CreateDate] [smalldatetime] NOT NULL,
    [CommentByAccountId] [int] NOT NULL,
    [CommentByUserName] [varchar](250) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
    [SystemObjectId] [int] NOT NULL,
    [SystemObjectRecordId] [bigint] NOT NULL,
    [FlaggedForDelete] [bit] NOT NULL CONSTRAINT [DF_Comments_FlaggedForDelete]  DEFAULT ((0)),
 CONSTRAINT [PK_Comments] PRIMARY KEY CLUSTERED 
(
    [CommentId] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

Я использую SQL Server 2005. Заранее спасибо.

1 Ответ

0 голосов
/ 12 августа 2010

Обновление

У меня есть некоторые реальные опасения по поводу вашего дизайна, я выложил их, используя сценарии.Ранее я назвал одну из своих проблем, которая заключается в том, что я не вижу способа привязать предупреждение к комментарию.

Сценарий: друг вывешивает на своей стене надпись: «Эй, я отдаю свой старый компьютер, дай мне знать, если хочешь».Конечно, вы не могли получить доступ к сайту в течение двух недель по какой-либо веской причине.Теперь, когда вы, наконец, вернетесь и увидите оповещение о публикации ваших друзей, вы хотите проверить это, НО!нет ничего, связывающего это предупреждение с комментарием.Поэтому, когда вы нажимаете на нее, вы просто заходите на стену своих друзей, а не прямо к публикации.Вы должны иметь возможность щелкнуть предупреждение и перейти прямо к комментарию / сообщению, но я не вижу никакого способа сделать это прямо сейчас.

Во-вторых, я не вижу ответа на комментарий.

Сценарий: я захожу на страницу друга Х и вижу, что он на этой неделе в Техасе по делам, и я хочу это прокомментировать.Поэтому я пишу в текстовом поле «эй, верни мне подарок» и отправляю его.Теперь, что происходит с этим комментарием?Он идет в таблице комментариев с идентификатором комментария, и к нему прикреплен мой идентификатор, но где что-то в базе данных говорит, что это ответ на комментарий?

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

Исходное сообщение

Похоже, вам нужен дополнительный столбец в таблице оповещений, по крайней мере, насколько я могу судить.Вот вопрос, который я задал себе: как мне, просто посмотрев на любую запись в таблице оповещений, к какому комментарию она относится?Я не могу, насколько я знаю.Это означает, что оповещение очень общее: «Эй, этот пользователь что-то сказал, но я не знаю, что, и если он удалит свой комментарий, это маленькое предупреждение все равно будет здесь, потому что оно не прикреплено ...».

Итак, я думаю, вам нужен столбец в таблице оповещений, который связывает его с исходным комментарием / публикацией / чем угодно.Теперь вы можете использовать этот оригинальный "CommentID" (?), Чтобы сделать публикацию, и все работает чисто и красиво.

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

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