2012-01-03 9 views
2

私はソーシャルネットワーキングサイトに取り組んでおり、ステータス、写真などを投稿できるFacebookのような壁があります。ユーザーのためだけに壁を構築することは難しいことではありません。私はこのような構造を持っています。Facebookの壁のタイプのためのデータベース構造

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.... 
    } 

私のテーブルに増分フィールドを使用しているので、ページにはユーザーが持つ同じIDを持つことができます。それは再び問題です。

次に、私は今のユーザーのために、私は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 

あなたはFacebookの、その一方の壁または少なくとも、私はそれを構築したいを見て、それが(何ページまたはグループにまたはに、利用者への)任意のオブジェクトに添付する必要がある場合。

これが今より意味をなさないことを願っています。

答えて

0

何らかの種類の「文字列」参照構造を作成しようとしている理由がわかりません。それは「リレーショナル」のようには見えません。

これはいかがですか。 ユーザー

多く投稿を持っています。

ユーザーウォールを持っています。

A ポストウォールを持っています。

ポストユーザーを持っています。

ウォール多く投稿を持っています。

ウォールユーザーを持っています。

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、私は文字列thatsなぜ私はここでこの質問をしている避けるためにしようとしています。 – Parminder

+0

言って、もう1つのオブジェクトページがあります。今、ページには壁もあります。どうやってするか。 ?? – Parminder

+0

私はUserのタイプを区別する一種の "UserType"フラグ(TINYINT)が必要だと思います。 1 =ユーザー、2 =グループ、3 =ページなど – RPM1984

0

私は可能な参照ごとに別々のnullableフィールドに行きます。これにより、外部キーを使用することもできます。必要であれば、すべての行にちょうど1つの参照が定義されている必要があります。私は間違いなくその文字列のアイデアのアイデアに行くことをお勧めしたいと思います - それを結合するのは効果的ではありません。

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

ありがとうございました。このアプローチでは、毎回2つの列が空白になります。さらに、オブジェクトをもう1つ追加したい場合は、db構造を変更する必要があります。 – Parminder

関連する問題