› 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 · Sep 15, 2014 · 4326 views
    This topic created in 4397 days ago, the information mentioned may be changed or developed.
    这么一个场景:

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

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

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

    第二步总感觉怪怪的,这种场景应该很常见吧,有什么可以优化的么
    7 replies  •  2014-09-16 09:56:57 +08:00
    jjdd
        1
    jjdd  
       Sep 15, 2014
    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  
       Sep 15, 2014 via Android
    参考一下wp的也不错
    geew
        3
    geew  
    OP
       Sep 15, 2014
    @jjdd 不然要多查一次表。。。。
    jjdd
        4
    jjdd  
       Sep 15, 2014
    @geew 你这样book_tag表就是有冗余字段了,“在tag表通过tag_id查出tag_name”这一步如果走缓存效率也不低
    geew
        5
    geew  
    OP
       Sep 15, 2014
    @jjdd 对的 tag_name 就是冗余数据 在不支持tag修改的情况下 这个是没问题的 但现在讨论的不是这个问题吧 是那个1+n的问题。。。
    shyrock
        6
    shyrock  
       Sep 15, 2014
    select tag_name from book_tag where book_id in (select book_id from book_tag where tag_id = 'xxx')
    是这个意思吧?看看MySQL自己能优化吗。。。
    revlis7
        7
    revlis7  
       Sep 16, 2014   ❤️ 1
    我的想法是,在book里增加一个字段做tag_name的冗余,而不是在book_tag表里做

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

    前提是如果对实时性要求不高,并且tag更新不频繁的话。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   4971 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 07:45 · PVG 15:45 · LAX 00:45 · JFK 03:45
    ♥ Do have faith in what you're doing.