我正在設計一個像今天其他人那樣的「牆」功能的社交網站。該數據庫有一個警報表,用於存儲一些值得與朋友分享的用戶操作。例如,當用戶更新他的狀態時,他的所有朋友都會收到通知。下表顯示了來自兩個唯一用戶的兩個狀態更新。第一個(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的感謝提前。
謝謝。警報表中的每個警報(狀態更新)都在海報和朋友的AccountID中重複。對於朋友帳戶1,6,3,8,2,13,5和9,將按帳戶17進行一次更新。您建議將警報中的FK添加到CommentID。這隻會影響原始海報和評論者之間的關係 - 所有其他帳戶將如何看到此評論?如果對所有朋友帳戶的單個狀態更新有多條評論(請記住,每個朋友帳戶都會在警報表中獲取狀態更新的副本),會發生什麼情況? – 2010-08-12 18:50:37