添加微博的私人共享

时间:2013-11-19 08:00:41

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

迈克尔·哈特尔的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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

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

但是,因为您已将“shared_ids”字段添加到微博表中,我假设您需要更精细的控制。因此,如果“私有共享”意味着“只与我选择查看此微博的那些粉丝共享”,那么,与微博桌上的“私人”标志一起,您应该创建一个新表来保存用户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时,只有那些用户id存在于micropost_viewers表中的用户才能查看微博。

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