V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
geew
V2EX  ›  MySQL

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

  •  
  •   geew · 2014-09-15 14:29:10 +08:00 · 3234 次点击
    这是一个创建于 3717 天前的主题,其中的信息可能已经有所发展或是发生改变。
    这么一个场景:

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

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

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

    第二步总感觉怪怪的,这种场景应该很常见吧,有什么可以优化的么
    7 条回复    2014-09-16 09:56:57 +08:00
    jjdd
        1
    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
        2
    kmvan  
       2014-09-15 15:02:54 +08:00 via Android
    参考一下wp的也不错
    geew
        3
    geew  
    OP
       2014-09-15 15:27:14 +08:00
    @jjdd 不然要多查一次表。。。。
    jjdd
        4
    jjdd  
       2014-09-15 15:45:29 +08:00
    @geew 你这样book_tag表就是有冗余字段了,“在tag表通过tag_id查出tag_name”这一步如果走缓存效率也不低
    geew
        5
    geew  
    OP
       2014-09-15 16:48:59 +08:00
    @jjdd 对的 tag_name 就是冗余数据 在不支持tag修改的情况下 这个是没问题的 但现在讨论的不是这个问题吧 是那个1+n的问题。。。
    shyrock
        6
    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
        7
    revlis7  
       2014-09-16 09:56:57 +08:00   ❤️ 1
    我的想法是,在book里增加一个字段做tag_name的冗余,而不是在book_tag表里做

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

    前提是如果对实时性要求不高,并且tag更新不频繁的话。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2989 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 14:50 · PVG 22:50 · LAX 06:50 · JFK 09:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.