SQL Server 2005:需要基本插入/记录逻辑帮助

时间:2010-08-11 20:24:49

标签: asp.net sql-server-2005

我正在设计一个社交网站,它具有像今天其他人一样的“墙”功能。该数据库有一个警报表,存储一些值得与他的朋友分享的用户操作。例如,当用户更新其状态时,他的所有朋友都会收到通知。下表显示了来自两个唯一身份用户的两个状态更新。第一个(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.提前感谢。

1 个答案:

答案 0 :(得分:0)

<强>更新

我对你的设计有一些真正的担忧,我已经使用场景将它们排除在外。我之前提到了我的一个问题,那就是我没有看到任何将警报与评论联系起来的方法。

情景:一位朋友在他的墙上发帖说“嘿,我送走了我的旧电脑,如果你想要它,请告诉我”。当然,由于一些充分的理由,您无法访问该网站两周。现在,当你终于重新开始并看到你的朋友发布的提醒时,你想去看看,但是!没有任何东西可以将此警报与评论联系起来。因此,当您点击它时,您只需转到您的朋友墙,而不是直接发布。您应该能够点击提醒并直接发表评论/帖子,但我现在看不到任何方式这样做。

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

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

我认为如果您解决其中一些其他设计问题,问题可能会自行解决,或者如果我已经离开,或者图片中还有其他表格未包含在内,请告诉我。

原帖

看起来你需要在Alerts表中添加一个额外的列,至少就我所知。以下是我问自己的问题:如何通过查看警报表中的任何记录来判断它属于哪个评论?据我所知,我不能。这意味着警报非常笼统“嘿,这个用户说了些什么,但我不知道是什么,如果他删除了他的评论,这个小警报仍然会在这里,因为它没有附加......”。

所以,我认为你需要一个Alerts表中的列,它将它链接回原始评论/发布/等等。现在你可以使用原始的“CommentID”(?)进行发布,一切都很干净漂亮。

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