我正在设计一个社交网站,它具有像今天其他人一样的“墙”功能。该数据库有一个警报表,存储一些值得与他的朋友分享的用户操作。例如,当用户更新其状态时,他的所有朋友都会收到通知。下表显示了来自两个唯一身份用户的两个状态更新。第一个(AlertId 689和690)由AccountId 53提交。由于他有一个frinend - 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
现在,用户可以对任何给定项目发表评论,在本例中为statusupdate。当提交 AddComment 时,我们正在使用ObjectRecordId(这是被注释的警报的主键),以便识别正在评论哪个statusupdate(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
当然,解决方法是做类似于我在警报表中所做的事情 - 当有人发表评论时,在评论表中为每个朋友做一个相应的行。 但是如何在Alerts表中访问我朋友的所有状态更新的AlertIds并将它们映射到评论表中的ObjectRecordId列?因为我只能访问与我的帐户相对应的状态更新(和他们相应的警告),我不知道在我朋友的帐户中相同的statusupdate警报是什么。
我现在能想到的唯一解决方案就是用我朋友的所有相应alertIds填充隐藏字段,所以当我评论某个项目时,我已经知道它们是什么。但这感觉很草率,我想知道那里是否有更好的想法?
对于它的价值,这里是dbo.Alerts的CREATE TABLE:
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.提前感谢。
答案 0 :(得分:0)
<强>更新强>
我对你的设计有一些真正的担忧,我已经使用场景将它们排除在外。我之前提到了我的一个问题,那就是我没有看到任何将警报与评论联系起来的方法。
情景:一位朋友在他的墙上发帖说“嘿,我送走了我的旧电脑,如果你想要它,请告诉我”。当然,由于一些充分的理由,您无法访问该网站两周。现在,当你终于重新开始并看到你的朋友发布的提醒时,你想去看看,但是!没有任何东西可以将此警报与评论联系起来。因此,当您点击它时,您只需转到您的朋友墙,而不是直接发布。您应该能够点击提醒并直接发表评论/帖子,但我现在看不到任何方式这样做。
其次,我没有看到回复评论。
场景:我去了朋友X的页面,看到他本周在德克萨斯州开展业务,我想对此发表评论。所以我在文本框中写下“嘿,把我送回礼物”并提交。现在这个评论会发生什么?它带有注释ID在评论表中,并附有我的ID,但数据库中的任何内容都表示它是对评论的回复?
我认为如果您解决其中一些其他设计问题,问题可能会自行解决,或者如果我已经离开,或者图片中还有其他表格未包含在内,请告诉我。
原帖
看起来你需要在Alerts表中添加一个额外的列,至少就我所知。以下是我问自己的问题:如何通过查看警报表中的任何记录来判断它属于哪个评论?据我所知,我不能。这意味着警报非常笼统“嘿,这个用户说了些什么,但我不知道是什么,如果他删除了他的评论,这个小警报仍然会在这里,因为它没有附加......”。
所以,我认为你需要一个Alerts表中的列,它将它链接回原始评论/发布/等等。现在你可以使用原始的“CommentID”(?)进行发布,一切都很干净漂亮。
我知道我没有直接回答你的实际问题......但我认为你的桌面设计可能需要一些工作。