关联查询的一个常见简单功能的实现疑惑

2014-09-15 14:29:10 +08:00
 geew
这么一个场景:

实例: 书-book, 标签-tag, 书和标签关联(多对多)- book_tag
应用: 获取某个标签下的书(标签又是书的一个属性, 即书的内容有标签字段)

实现:
1. 连表book和book_tag获取到标签下的书列表 - 1
2. 针对每本书,再到表book_tag里面查询该书的标签 - n

注: book_tag里面保存了tag_name 因此可以不用连表tag了

第二步总感觉怪怪的,这种场景应该很常见吧,有什么可以优化的么
3091 次点击
所在节点    MySQL
7 条回复
jjdd
2014-09-15 14:54:31 +08:00
1,在book_tag表中通过tag_id查出所以的book_id
2,要查每本书的tag_name,在book_tag表通过book_id查出所有的tag_id,再在tag表通过tag_id查出tag_name

book_tag表里面存tag_name字段干嘛?
kmvan
2014-09-15 15:02:54 +08:00
参考一下wp的也不错
geew
2014-09-15 15:27:14 +08:00
@jjdd 不然要多查一次表。。。。
jjdd
2014-09-15 15:45:29 +08:00
@geew 你这样book_tag表就是有冗余字段了,“在tag表通过tag_id查出tag_name”这一步如果走缓存效率也不低
geew
2014-09-15 16:48:59 +08:00
@jjdd 对的 tag_name 就是冗余数据 在不支持tag修改的情况下 这个是没问题的 但现在讨论的不是这个问题吧 是那个1+n的问题。。。
shyrock
2014-09-15 18:23:42 +08:00
select tag_name from book_tag where book_id in (select book_id from book_tag where tag_id = 'xxx')
是这个意思吧?看看MySQL自己能优化吗。。。
revlis7
2014-09-16 09:56:57 +08:00
我的想法是,在book里增加一个字段做tag_name的冗余,而不是在book_tag表里做

用计划任务定期根据book_tag里的关系去更新book表中新增的tag_name字段

前提是如果对实时性要求不高,并且tag更新不频繁的话。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/133552

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX