答案取决于如何定义“私人共享”。
如果“私人分享”的意思是“允许我的所有关注者看到帖子,但不允许其他人看到”,那么按照 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 索引的单独表可以让您非常快速地识别特定用户的行。