首页   注册   登录
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
拉钩
V2EX  ›  MySQL

新手求指教,查询一对多/多对多关系,映射到编程语言的对象,常规操作是怎样的?

  •  
  •   changrui0608 · 182 天前 · 755 次点击
    这是一个创建于 182 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如最简单的模型吧,博客有文章 post 和标签 tag,是多对多关系;
    数据库 schema 设计中,一般通过 id 的互相引用;
    编程语言中,通常表现为一个 Post 对象,有一个 Tags 数组属性,里边是多个 Tag 的内容;

    问题就是,不用 ORM 纯手写 SQL 的话,怎么做到一次查询数据库,转换到 Post 对象,并填充 Tags 属性的?

    看过一些 ORM 的实际 SQL 日志,一般会是用 LEFT JOIN,但 LEFT JOIN 的话,比如一个 Post 有多个 Tag,那么查询结果中一个含有 N 个 Tag 的 Post 就会重复出现 N 次。

    虽然是可以手动编程排除重复 Post 并依次处理 Tag,但是感觉极为蛋疼,复杂度也不低,所以想请教下,这种情况下的常规操作是怎样的?
    9 回复  |  直到 2018-06-15 08:48:18 +08:00
        1
    alexsunxl   182 天前
    典型的想得太多, 做得太少, 哈哈哈
    别纠结这些了, 最后还是看场景看业务看历史
    这种东西没有最佳实践的,只能说相对较合适,
    至于怎么是合适,那还是多积累吧
        2
    changrui0608   182 天前
    @alexsunxl
    兄弟,我不是做的太少,我是做到这儿了不知道怎么办才来问的,你这话就和没说一样啊...
        3
    Stevenv   182 天前
    你可以换种方式,多查几次。别想着一条 SQL 查出来。。以前我也是想一条查出来,结果发现是为难自己
        4
    DavidNineRoc   182 天前   ♥ 1
    看了一下 lv 的 SQL

    ## 先查询 posts 表
    select * from posts where xxxx
    ## 连接查询关联关系
    SELECT
    `tags`.*,
    `post_tag`.`post_id` AS `pivot_post_id`,
    `post_tag`.`tag_id` AS `pivot_tag_id`
    FROM
    `tags`
    INNER JOIN `post_tag` ON `tags`.`id` = `post_tag`.`tag_id`
    WHERE
    `post_tag`.`post_id` IN (## 这里是 posts 表查询的数据 ## )
    ##
    然后将第二次查询的数据按照 pivot_post_id 分组,循环一遍 posts 查询出的数据,直接按 pivot_post_id 组设置为单个 posts 的属性。
        5
    AlphaTr   182 天前
    关系型数据库一次查询返回就会出现「 N 个 Tag 的 Post 就会重复出现 N 次」这种情况。一种方式就是你说的,手动编程排重;另一种方式就是多次查询。或者可以直接上非关系型数据库;
        6
    changrui0608   182 天前
    @DavidNineRoc 多谢,查了一下午似乎是这种方法最合适,顺便 lv 全程是什么
        7
    cxbig   182 天前 via iPhone
    关键词:ORM eager loading
    抓 SQL 看看人家怎么处理的就明白了
        8
    Foolt   182 天前
    MySQL 去重关键字 DISTINCT 了解一下
        9
    DavidNineRoc   181 天前
    @changrui0608 laravel
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1081 人在线   最高记录 4019   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.1 · 18ms · UTC 17:47 · PVG 01:47 · LAX 09:47 · JFK 12:47
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1