数据库: 多对多关系哪种表示形式更优? 全面?
背景:
我要为我们的产品添加打标签的功能, 一个产品可以有多个标签, 而且每个标签可以被多个产品使用, 也就是所谓的多对多关系.
具体化:
我们有1000万个产品Product, 管理员定义了20个标签Tag, 我们要给这1000万个产品打上标签(1个或多个), 为此我们建立了一个Product表和一个Tag表.
问题:
怎么表示这个多对多关系? 优化方案?性能?
我们第一个想法:
中间表: ProductTag连接Product和Tag, 形成多对多关系. 但这样每次需要遍历ProductTag表和从Tag表获取标签描述信息, 因为查看标签远远大于设置标签的次数, 那这样岂不是很浪费效率?
于是第二个想法:
缓存字段, 在Product里面定义一个数组类型字段tags, 里面存储Tag对象的id, 那这样就可以查看的时候,直接根据tags获取Tag对象数组,然后获取每个标签的描述信息. 但是问题来了, 有天管理员从Tag表删除了一个标签对象, 那么我们要遍历所有的Product, 从tags删除掉这个标签的id. oh my god!!!
于是第三个想法:
我们还是用第二个想法, 只是管理员删除一个标签对象时, 我们不做任何操作, 而是在查看产品的标签数据时, 检查tags里面的标签是否有效(查询Tag表). 那么问题又来了, 查看产品次数远比删除标签的次数多, 岂不是又浪费效率性能?
有没有更好的方法?或者优化方案?
望解答!感谢~
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
可以先扩展一下『第二个想法』,Product存tags字段,自然Tag也能存products字段存放这个标签有哪些product,你要删某个tag,把这个tag的products拿出来遍历一部分即可,也就是这份『关系』同时在Product和Tag冗余一份。但是这样做要不了多久products字段非常大,实操下来肯定很慢。
那么结合『第一个想法』,不要products字段,只要tags字段,再加上做了索引的ProductTag中间表,平时不用ProductTag,一旦要删tag,从ProductTag表读,然后一个个去处理Product的tags字段。
希望能帮助到你。