【问题标题】:Database design for Social network friends list, friends circle, post sharing [closed]社交网络好友列表、朋友圈、帖子分享的数据库设计[关闭]
【发布时间】:2011-12-29 01:18:58
【问题描述】:

我希望用户按照发布顺序查看最近的帖子,但前提是创建帖子的用户授予用户查看它们的权限。很像 google+ 圈子列表。

这是我的原创设计,如有任何改进建议,将不胜感激。

USER
Id
Name
...


POST
Id
Message
IsCloseFriendCanView
IsFamilyCanView
IsAcquaintanceCanView
IsDisabledComment
IsPostLock
CreatedByUserId
Created_Time
LastComment_Time 
...

POST_COMMENT
Id
PostId
Message
CreatedByUserId
Created_Time


FRIEND
Id
UserId
FriendUserId
IsCloseFriend
IsFamily
IsAcquaintance
IsBlocked
....

FRIEND_LIST (custom friends list only)
Id
UserId (owner)
FriendId
FriendListTypeId

FRIEND_LIST_TYPE 
Id
UserId
Name
...

POST_FRIEND (CAN VIEW)
Id
PostId
FriendId
....


POST_FRIEND_LIST (CAN VIEW - custom)
Id
PostId
FriendListTypeId
....

编辑:更新

【问题讨论】:

    标签: database-design social-networking


    【解决方案1】:

    不确定这是否是您想要的,但似乎您还需要一个表格来保存用户和朋友之间的关系

    例如

    FRIEND
    user_id
    friend_id
    close_friend
    

    在 POST 上,您需要确定它是否对“所有朋友”、“亲密朋友”或“公众”可见。

    然后假设 $this_user 是登录用户或一些虚拟值,例如-1 如果未登录,您可以选择一个有效帖子列表,该列表将显示

    1. 登录用户创建的帖子
    2. 登录用户的朋友创建的帖子对所有朋友可见
    3. 已登录用户的好友创建的帖子对密友可见
    4. 帖子设为公开

    使用类似的东西

    select p.id, p.message, 
      from POST p
     where createdbyuserid=$this_user 
        or (visible='F' 
            and exists (select 1 
                     from friend f 
                    where p.createdbyuserid=f.user_id 
                      and f.friend_id=$this_user)
           )
        or (visible='C' 
            and exists (select 1 
                     from friend f 
                    where p.createdbyuserid=f.user_id 
                      and f.friend_id=$this_user
                      and f.close_friend='Y')
           )
        or (visible='P')
     order by created_time
    

    如果没有用户登录,则 $this_user 将设置为 -1,因此只有公开帖子可见。

    然后您使用此选择的结果在后续选择中获取每个帖子的相关 cmets。

    【讨论】:

    • 酷,我认为你的方法比我的好:) 所以我们不需要 post_view 吗?您可以与朋友分享并排除朋友约翰、爱丽丝等的条件呢?
    • 与朋友的分享应该通过在 FRIEND 表中的条目来处理。 Facebook 为密友添加了一项功能,因此为了模仿这一点,您可以在好友表中为密友 Y 或 N 添加一个标志,然后在 POST 表上,具有三个可见选项。我已经修改了原始答案中的 SQL 以反映这一点
    • 谢谢特雷弗,好的,让我明白这一点,你如何满足所有朋友都可以看到约翰、鲍勃和爱丽丝的条件,或者特定于朋友 X、Y、Z 除了 Q, R,S。或除 groupZ、朋友 A、B、C 之外的所有朋友。
    • 如果您需要排除特定的人,您是否打算对每个帖子都这样做?然后创建帖子的人需要指定哪些人可以看到它,在这种情况下,您可能确实需要一个 POST_VIEW 表,就像您最初建议的 post_id 和friend_Id 一样。根据登录用户是朋友,将帖子加入此表。前面的建议是基于您选择朋友的一个子集,然后允许他们比其他人看到更多,因此您最初的想法是 POST_VIEW。您可以选择所有朋友,然后使用减号排除特定集合。
    • 见上面的更新,两个帖子视图表怎么样,一个用于朋友的帖子视图,另一个用于朋友列表的帖子视图,不知何故我们可以只有一个帖子视图表?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-13
    相关资源
    最近更新 更多