2012-01-03 2 views
2

소셜 네트워킹 사이트에서 일하고 있으며 사용자가 상태, 사진 및 자료를 게시 할 수있는 페이스 북과 같은 벽이 있습니다. 사용자를 위해 벽을 만드는 것은 어려운 일이 아닙니다. 나는 이런 구조를 가지고있다.페이스 북 벽 유형 요구 사항에 대한 데이터베이스 구조

Wall 
    { 
    Id, 
    ToUserId (BigInt) (Owner of wall) 
    ByUserId (The person who is posting) 
    Content (message, pic or something else) 
    more fields.... 
    } 

이 벽은 단지 사용자에 대해, 나는 그것을 다시 기운, 예를 들어, 내가 생각하고 사이트가 너무 페이지와 같은 다른 개체를해야합니다, 등 그룹 그래서 모든 개체는 그들에게 벽이있을 것이다. 각 벽마다 별도의 테이블을 만들고 싶지 않습니다.

그런 다음 ToUserId 대신 ObjectId를 사용할 수 있으며 내 구조가 이와 같을 것이라고 생각했습니다.

Wall 
    { 
    Id, 
    ObjectId (BigInt)(PageId/UserId/GroupId (one of them)) 
    ByUserId (The person who is posting) 
    Content (message, pic or something else) 
    more fields.... 
    } 

내 테이블에 Increment 필드를 사용하고 있기 때문에 페이지에 사용자가 가진 ID가 동일 할 수 있습니다. 그래서 다시 문제가됩니다.

다음으로, 나는 그래서이 될 것입니다 아이디 "1U", "2U을"개체 수에 "U"를 추가하고 대한 것, 내 객체가 문자열 유형 사용자에 대한 지금

Wall 
    { 
    Id, 
    ObjectId (string(10))(PageId/UserId/GroupId (one of them)) 
    ByUserId (The person who is posting) 
    Content (message, pic or something else) 
    more fields.... 
    } 

해야한다 생각 페이지는 "1P", "2P", 그룹은 "1G", "2G"입니다.

하지만 여전히 설득력이 없습니다. 전문가의 조언을 듣고 싶습니다.

업데이트

고마워, 문제, 나는 데 내가 벽의 모든 유형에 대해 하나 개의 테이블을 유지할 수있는 방법이다.

A wall for a User 
A Wall for a Page 
A Wall for a Group 

당신은 페이스 북, 그 하나의 벽을 얻거나, 내가 그것을 구축하고자 보면, 그래서는 (어떤 페이지 또는 그룹에하거나, 사용자에게) 모든 개체에 연결해야합니다.

나는 이것이 더 이해되기를 바랍니다.

답변

0

어떤 종류의 "문자열"참조 구조를 만들려고하는지 이해할 수 없습니다. 그건 "관계형"같지 않습니다.

어때? 사용자

많은게시물 있습니다.

사용자 있습니다.

포스트 있습니다.

포스트사용자 있습니다.

많은게시물 있습니다.

사용자 있습니다.

POCO의 (내가 방해 할 수 없기 때문에 쓰기 SQL)

public class User 
{ 
    public int UserId { get; set; } 
    public ICollection<Post> Posts { get; set; } // the Posts this user has written. Could be against different Wall's 
    public Wall Wall { get; set; } // the User's wall. 
} 

public class Post 
{ 
    public int PostId { get; set; } 
    public User User { get; set; } // the User who wrote the post. 
    public Wall Wall { get; set; } // the Wall this Post belongs to. 
} 

public class Wall 
{ 
    public int WallId { get; set; } 
    public ICollection<Post> Posts { get; set; } // all the posts on this Wall. 
} 

가정 :

  • 포스트은 하나의 에 대해 수행 할 수 있습니다.
+0

감사합니다 RPM, 나는 왜 내가이 질문을 여기에서 묻고 있는지 문자열을 피하려고 노력하고있다. – Parminder

+0

말, 하나 이상의 개체 페이지가 있습니다. 이제 페이지에도 벽이 있습니다. 그렇게하는 방법. ?? – Parminder

+0

사용자 유형을 구분하는 일종의 "UserType"플래그 (TINYINT)가 필요하다고 생각합니다. 1 = 사용자, 2 = 그룹, 3 = 페이지 등 – RPM1984

0

각 가능한 참조마다 별도의 nullable 필드로 이동합니다. 이렇게하면 외래 키를 사용할 수 있으며 원할 경우 모든 행에 정확하게 하나의 참조가 정의되어 있어야하므로 제약 조건을 확인할 수도 있습니다. 나는 확실히 그 문자열 id 아이디어에가는 것을 추천하지 않을 것이다 - 그것에 조인을하는 것은 비효율적이다.

create table [Posts] 
(
    [ID] int not null identity(1, 1), 
    [ID_FromUser] int not null, 
    [ID_ToUser] int null, 
    [ID_ToPage] int null, 
    [ID_ToGroup] int null, 
    [Content] nvarchar(max) not null, 
    -- more stuff 

    constraint [FK_Posts_FromUser] foreign key ([ID_FromUser]) references [Users]([ID]), 
    constraint [FK_Posts_ToUser] foreign key ([ID_ToUser]) references [Users]([ID]), 
    constraint [FK_Posts_ToPage] foreign key ([ID_ToPage]) references [Pages]([ID]), 
    constraint [FK_Posts_ToGroup] foreign key ([ID_ToGroup]) references [Groups]([ID]), 
    constraint [PK_Posts] primary key ([ID]) 
) 
+0

감사합니다. 루카스 (Lukas)에게 감사하지만,이 방법을 사용할 때마다 두 개의 열이 비워집니다. 또한 하나 이상의 객체를 추가하려면 db 구조를 변경해야합니다. – Parminder

관련 문제