Я проектирую сайт социальной сети, у которого есть функция "стены", как и у других сегодня. В базе данных есть таблица предупреждений, в которой хранятся некоторые действия пользователя, которыми стоит поделиться со своими друзьями. Например, когда пользователь обновляет свой статус, все его друзья получают уведомление. В таблице ниже показаны два обновления статуса от двух уникальных пользователей. Первый (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. Заранее спасибо.