Database design 社交网络好友列表、好友圈、帖子共享的数据库设计

Database design 社交网络好友列表、好友圈、帖子共享的数据库设计,database-design,social-networking,Database Design,Social Networking,我希望用户按最近发布的帖子的发布顺序进行查看,但前提是创建帖子的用户授予用户查看帖子的权限。很像谷歌+圈列表 这是我的原始设计,如有任何改进建议,将不胜感激 USER Id Name ... POST Id Message IsCloseFriendCanView IsFamilyCanView IsAcquaintanceCanView IsDisabledComment IsPostLock CreatedByUserId Created_Time LastComment_Time .

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

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

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

编辑:已更新

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

e、 g

在这篇文章中,你们需要一些东西来确定它对“所有的朋友”、“亲密的朋友”还是“公众”是可见的

然后假设$this_user是一个已登录的用户或某个伪值,例如-1,如果未登录,则可以选择一个有效帖子列表,其中将显示

  • 由登录用户创建的帖子
  • 由登录用户的朋友创建的帖子对所有朋友都可见
  • 登录用户的好友创建的帖子对好友可见
  • 设为公开职位
  • 使用类似

    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,这样只有公共帖子才可见


    然后,您可以使用此选择的结果在后续选择中获取每个帖子的相关评论。

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

    e、 g

    在这篇文章中,你们需要一些东西来确定它对“所有的朋友”、“亲密的朋友”还是“公众”是可见的

    然后假设$this_user是一个已登录的用户或某个伪值,例如-1,如果未登录,则可以选择一个有效帖子列表,其中将显示

  • 由登录用户创建的帖子
  • 由登录用户的朋友创建的帖子对所有朋友都可见
  • 登录用户的好友创建的帖子对好友可见
  • 设为公开职位
  • 使用类似

    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,这样只有公共帖子才可见


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

    酷,我认为您的方式比我的好:)那么我们不需要帖子视图了吗?您可以与朋友共享和排除朋友John、Alice等的条件如何?与朋友共享应通过在“朋友”表中添加一个条目来处理。Facebook为好友添加了一项功能,因此为了模仿这一点,您可以在好友表中为好友Y或N添加一个标志,然后在帖子表中添加三个可见选项。我已经修改了原始答案中的SQL以反映这一点谢谢Trevor,好的,让我了解一下这一点,您如何满足以下条件:除john、bob和alice之外的所有朋友都可以看到,或者特定于除Q、R、S之外的X、Y、Z的朋友,或者除groupZ之外的所有朋友,朋友A、B、C。如果您需要排除特定的人,你打算为每个帖子都这样做吗?然后,创建帖子的人需要指定哪些人可以看到帖子。在这种情况下,您可能确实需要一个帖子视图表,正如您最初建议的那样,具有帖子id和好友id。根据作为好友的登录用户,将帖子加入此表。前面的建议是基于您选择朋友的子集,然后允许这些朋友看到比其他人更多的内容,这样您就可以看到POST_视图的原始想法。你可以选择所有好友,然后使用减号来排除特定的集合。请参见上面的更新,两个post view表格怎么样,一个用于好友的post view,另一个用于好友列表的post view,不知何故,我们可以只有一个post view表格吗?酷,我认为你的方式比我的好:)那么我们不需要post_view了吗?您可以与朋友共享和排除朋友John、Alice等的条件如何?与朋友共享应通过在“朋友”表中添加一个条目来处理。Facebook为好友添加了一项功能,因此为了模仿这一点,您可以在好友表中为好友Y或N添加一个标志,然后在帖子表中添加三个可见选项。我已经修改了原始答案中的SQL以反映这一点谢谢Trevor,好的,让我了解一下这一点,您如何满足以下条件:除john、bob和alice之外的所有朋友都可以看到,或者特定于除Q、R、S之外的X、Y、Z的朋友,或者除groupZ之外的所有朋友,朋友A、B、C。如果您需要排除特定的人,你打算为每个帖子都这样做吗?然后,创建帖子的人需要指定哪些人可以看到帖子。在这种情况下,您可能确实需要一个帖子视图表,正如您最初建议的那样,具有帖子id和好友id。根据作为好友的登录用户,将帖子加入此表。前面的建议是基于您选择朋友的子集,然后允许这些朋友看到比其他人更多的内容,这样您就可以看到POST_视图的原始想法。您可以选择所有好友,然后使用减号排除特定的集合。请参阅上面的更新,两个post view表如何,一个用于好友的post view,另一个用于好友列表的post view,我们可以只使用一个post view表吗?