【问题标题】:Adding private sharing of microposts添加微博私密分享
【发布时间】:2013-12-02 16:29:12
【问题描述】:

Michael Hartl 的 book 展示了如何构建类似于 Twitter 的东西,最终得到如下所示的数据库架构:

table: users
  id
  name
  email

table: microposts
  id
  content
  user_id

table: relationships
  id
  follower_id
  followed_id

假设我想将私人共享添加为一项功能。直接天真的尝试是将微帖子表更改为下面的shared_ids 有一些我不确定的类型。对于完全不熟悉 SQL 和设计模式的人来说,解决这个问题的标准惯用方法是什么。

table: microposts
  id
  content
  user_id
  shared_ids

【问题讨论】:

    标签: sql ruby-on-rails schema railstutorial.org


    【解决方案1】:

    答案取决于如何定义“私人共享”。

    如果“私人分享”的意思是“允许我的所有关注者看到帖子,但不允许其他人看到”,那么按照 user3019284 的建议,在微博表中添加一个“私人”标志就足够了。

    table: microposts
      id
      content
      user_id
      private (values: 0=Not private; 1=Private)
    

    但是,由于您已将“shared_ids”字段添加到 microposts 表中,我假设您需要更精细的控制。因此,如果“私人分享”意味着“只与我选择查看此微博的那些关注者分享”,那么,连同微博表上的“私人”标志,您应该创建一个新表来保存用户 id(s ) 那些被允许查看微博的人。比如:

    table: microposts
      id
      content
      user_id
      private (values: 0=Not private; 1=Private)
    
    table: micropost_viewers
      micropost_id
      user_id
    

    其中 (micropost_id, user_id) 包含 micropost_viewers 上的唯一键(不需要“id”列)。此外,在 micropost_viewers.user_id 上放置一个非唯一索引,以便您可以快速找到允许特定用户查看的私人微博。

    或者,也许您想要“私人共享”的两种含义。在这种情况下,我会建议:

    table: microposts
      id
      content
      user_id
      private (values: 0=Not private; 1=All Followers; 2=Specified Followers)
    
    table: micropost_viewers
      micropost_id
      user_id
    

    当 microposts.private = 0 时,所有用户都可以看到微博。

    当microposts.private = 1时,所有关注者都可以看到微博。

    当 microposts.private = 2 时,只有 microposts.id 对应的 micropost_viewers 表中存在 user id 的用户才能查看微博。

    附:在极少数情况下,您是否希望将用户 ID 列表放在单个列中(例如 shared_ids)。原因是,在大型数据库中,查询效率极低。查找与特定用户相关的行的唯一方法是扫描所有行。然而,使用带有 user_id 索引的单独表可以让您非常快速地识别特定用户的行。

    【讨论】:

      【解决方案2】:

      为什么不在微帖子表中添加一个新的位列来指示帖子是私有的?从关系中链接的任何人都来自私人邀请。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-06-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-08
        相关资源
        最近更新 更多