2010-08-11 2 views
1

오늘 다른 사람들과 마찬가지로 "벽"기능을 가진 소셜 네트워킹 사이트를 디자인하고 있습니다. 데이터베이스에는 친구들과 공유 할 가치가있는 사용자 행동을 저장하는 알림 테이블이 있습니다. 예를 들어 사용자가 자신의 상태를 업데이트하면 모든 친구에게 알림이 전송됩니다. 아래 표는 두 명의 고유 사용자로부터 두 개의 상태 업데이트를 보여줍니다. 첫 번째 (AlertId 689 및 690)는 AccountId 53에 의해 제출됩니다. 그는 AccountId 57이라는 하나의 프렌드를 가지고 있으므로이 행이 테이블에 추가되므로이 사용자가 로그온하면 계정 53의 업데이트가 자신의 벽에 표시됩니다. 같은 방식으로 다른 사용자의 상태 업데이트에는 3 명의 친구가 있기 때문에 4 개의 행이 있습니다.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 

이제 사용자는 주어진 항목 (이 경우에는 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(); 
    } 
: - (ObjectId가 우리에게 자사의 statusupdate을 알려줍니다 참고하시기 바랍니다) AddComment이 제출 된 경우에 댓글되고있는 statusupdate 식별하기 위해, 우리는 (경고의 기본 키에 댓글을되는) ObjectRecordId를 사용하는

이제 문제는 친구의 상태 업데이트에 댓글을 달려고 할 때 경고 표의 해당 계정에 해당하는 AlertId (또는 Comments 테이블의 ObjectRecordId)를 사용한다는 것입니다. 결과는 의견이 그의 친구의 주석과 없음들만 볼 수 있다는 것입니다 :

이에 대한 해결책은 내가 경고 테이블에서했던 것과 비슷한 일을하는 것입니다 물론
[CommentId] [Body] [CommentById] [CommentByName] [ObjectId] [ObjectRecordId] [Delete] 
    97  hello world. 57   GrumpyCat  7   690   0 

- 누군가가 코멘트를한다, 댓글 테이블의 모든 친구에 해당하는 행을 만듭니다. 하지만 경고 테이블의 모든 친구 상태 업데이트에 대한 AlertId에 액세스하고 코멘트 테이블의 ObjectRecordId 열에 어떻게 매핑합니까? 내 계정 (및 해당 alertids)에 해당하는 상태 업데이트에만 액세스 할 수 있기 때문에 친구 계정에서 동일한 상태 업데이트에 대한 alertids가 무엇인지 알 수 없습니다.

내가 생각할 수있는 유일한 해결책은 숨겨진 필드를 내 친구의 해당 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] 

나는 2005 년 감사 SQL 서버를 사용하고 미리.

답변

0

업데이트

나는 당신의 디자인에 대한 몇 가지 실제 문제가, 내가 시나리오를 사용하여 밖으로 누워했습니다. 나는 나의 관심사 중 하나를 일찍 지명했다. 그것은 내가 경고문을 덧붙일 수있는 어떤 방법도 보이지 않는다는 것이다.

시나리오 : 친구가 벽에 "이봐, 내 오래된 컴퓨터를 내놓고있어, 네가 원한다면 알려줘"라고 게시합니다. 물론 좋은 이유 때문에 2 주 동안 사이트에 액세스 할 수 없었습니다. 이제 마침내 다시 돌아와 친구 게시판에 대한 알림을 보면서 확인하고 싶습니다. 이 경고를 코멘트에 묶는 것은 아무것도 없습니다. 그래서 당신이 그것을 클릭하면 당신은 친구의 벽에 가서 게시에 stright하지 않습니다.알림을 클릭하여 댓글/게시물로 바로 이동할 수 있어야하지만 지금 당장이 작업을 수행 할 방법이 없습니다.

두 번째로, 나는 어쨌든 코멘트에 회신하는 것을 보지 못합니다.

시나리오 : 저는 친구 X의 페이지로 이동하여 이번 주에 그가 비즈니스를 위해 텍사스에 있다는 것을 알고 그것에 대해 논평하고 싶습니다. 그래서 나는 텍스트 상자에 "이봐, 나에게 선물을 가져다"라고 적어서 제출한다. 이제이 댓글은 어떻게됩니까? 그것은 주석 ID와 코멘트 테이블에 가서 내 ID가 첨부되어 있지만, 데이터베이스에있는 모든 것은 코멘트에 대한 회신이라고 말합니까?

다른 디자인 문제를 해결하면 문제가 해결 될 것이라고 생각합니다. 또는 내가 벗어 났거나 포함되지 않은 다른 테이블이 포함되어 있다면 알려주세요. 당신이 경고 테이블에 여분의 열을 필요로 같은

원래의 게시물

그것은 적어도 지금까지 내가 말할 수있는, 보인다. 내가 직접 물어 본 질문은 다음과 같습니다. 경보 테이블의 모든 레코드를보고 알 수있는 설명이 무엇인지 어떻게 알 수 있습니까? 나는 내가 아는 한 멀리 할 수 ​​없다. 이것은 Alert가 매우 일반적이라는 것을 의미합니다. "이 사용자가 뭐라 말했는지 모르겠지만 무엇이 있는지 모르겠다. 그리고 그가 그의 코멘트를 삭제하더라도이 작은 경고는 붙어 있지 않기 때문에 여전히 여기에있을 것입니다 ...".

그래서 나는 원래의 코멘트/게시/무엇이든지 다시 연결하는 경고 테이블의 열이 필요하다고 생각합니다. 이제는 원래 "CommentID"(?)를 사용하여 게시 작업을 수행 할 수 있으며 모든 것이 깨끗하고 멋지게 작동합니다.

나는 당신의 실제 질문에 직접 답하지 않았지만 당신의 테이블 디자인은 약간의 작업이 필요할 것이라고 생각합니다.

+0

감사합니다. 각 경고 (상태 업데이트)는 포스터 및 친구의 AccountID에 대한 경고 테이블에 복제됩니다. 계정 17에 의한 단일 업데이트는 친구 계정 1,6,3,8,2,13,5 및 9에 대해 복제됩니다. 경고에서 FK를 CommentID에 추가하는 것이 좋습니다. 이것은 원래의 포스터와 코멘트 작성자 사이의 관계에만 영향을 미칠 것입니다 - 다른 모든 계정은 어떻게이 커미션을 볼 수 있습니까? 모든 친구 계정에서 단일 상태 업데이트에 대한 의견이 여러 개있을 때 (각 친구 계정은 알리미 테이블에서 상태 업데이트 사본을 얻습니다.) –