2010-08-11 98 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