2010-08-11 102 views
1

我正在设计一个像今天其他人那样的“墙”功能的社交网站。该数据库有一个警报表,用于存储一些值得与朋友分享的用户操作。例如,当用户更新他的状态时,他的所有朋友都会收到通知。下表显示了来自两个唯一用户的两个状态更新。第一个(AlertId 689和690)由AccountId 53提交。由于他有一个分支 - AccountId 57 - 该行被添加到表中,所以当此用户登录时,他将在他的墙上看到帐户53的更新。以同样的方式,另一个用户的状态更新有四行,因为他有三个朋友。SQL Server 2005:需要基本的插入/记录逻辑帮助

[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提交,我们是为了确定哪些statusupdate正在评论使用ObjectRecordId(这是警报的主键的上评论)(仅供参考 - 在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列?由于我只能访问与我的帐户(及其相应的alertids)相对应的状态更新,因此我不知道我的朋友帐户中的alertid对于相同的状态更新是什么。

我现在能想到的唯一解决方案是用隐藏的字段填充所有朋友的相应alertId,所以当我评论一个项目时,我已经知道它们是什么了。但是,这感觉很渺茫,我想知道有没有更好的想法呢?

对于什么是值得的,这里是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

更新

我对你的设计一些真正关心的问题,我已经奠定了他们使用场景。我早些时候指出了我的一个担忧,那就是我没有看到任何将警报与评论联系起来的方法。

情景:一位朋友在他的墙上发帖说:“嘿,我放弃我的旧电脑,让我知道你是否想要它”。当然,由于某种原因,您无法访问该网站两周。现在,当你终于回来,看到你的朋友张贴你想要去检查它的警报,但是!没有什么能够将这种警告与评论结合起来。所以当你点击它时,你只需去你的朋友墙,不要直接发帖。您应该可以点击提醒并直接进入评论/帖子,但我现在没有看到任何方式。

其次,我没有看到回复评论。

场景:我去朋友X的页面,看到他本周在德克萨斯州做生意,我想对此发表评论。所以我在文本框中写下“嘿,把我送回礼物”并提交。现在这个评论发生了什么?它在注释表中附带注释ID,并附有我的ID,但数据库中的任何内容都表示它是对注释的回复?

我想如果你解决了其他一些设计问题,这个问题可能会自行解决,或者如果我走了,或者图片中没有包含其他表格,请告诉我。

原贴

它看起来像你需要在警报表中额外的列,至少据我可以告诉。以下是我问自己的问题:如何查看警报表中的任何记录,我怎么知道它属于哪个评论?据我所知,我无法做到。这意味着警报非常普遍,“嘿,这个用户说了些什么,但我不知道是什么,如果他删除了他的评论,这个小警报仍然会在这里,因为它没有附加...”。

所以,我认为你需要在Alerts表中的一个列,它将它链接回原始评论/发布/任何。现在,您可以使用原始的“CommentID”(?)使发帖和一切工作变得干净漂亮。

我知道我没有直接回答你的实际问题......但我认为你的餐桌设计可能需要一些工作。

+0

谢谢。警报表中的每个警报(状态更新)都在海报和朋友的AccountID中重复。对于朋友帐户1,6,3,8,2,13,5和9,将按帐户17进行一次更新。您建议将警报中的FK添加到CommentID。这只会影响原始海报和评论者之间的关系 - 所有其他帐户将如何看到此评论?如果对所有朋友帐户的单个状态更新有多条评论(请记住,每个朋友帐户都会在警报表中获取状态更新的副本),会发生什么情况? – 2010-08-12 18:50:37