迈克尔·哈特尔的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
答案 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索引的单独表可以让您快速识别特定用户的行。