请教有关 ORM 1+N 查询的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ydc886
V2EX    Java

请教有关 ORM 1+N 查询的问题

  •  1
     
  •   ydc886 2019-04-21 11:24:25 +08:00 3490 次点击
    这是一个创建于 2380 天前的主题,其中的信息可能已经有所发展或是发生改变。

    举个例子,T_A 这张表中,有 T_B.id FK,T_C.id FK,T_D.id FK. 业务上,查询想要带出 T_B.name, T_C.name, T_D.name。这个问题,我想到常见的方案是:1. 数据库下手,加冗余字段,这个方案会引入是更新时也要修改冗余字段,此外,业务上,在页面展示的数据增加额外的列也很常见,那就要再扩充冗余字段。2. 主表查询到结果后,取外键集合在各个外键表用 in id 查询,这个也是我在工程里常用的方式。3. 二级缓存,这就需要设计缓存更新了吧(这个和第二种方式类似,维护一个映射)。除了这三个还有啥思路吗?

    9 条回复    2019-04-22 12:07:17 +08:00
    jamesxu
        1
    jamesxu  
       2019-04-21 12:15:37 +08:00 via iPhone   1
    联表查啊
    reus
        2
    reus  
       2019-04-21 13:31:27 +08:00   2
    本来用 JOIN 无比简单的事情,套了个 ORM 就各种不顺

    那你还用 ORM 干嘛?
    shihaoyu
        3
    shihaoyu  
       2019-04-21 14:44:08 +08:00
    不知道楼主的 ORM 是什么框架的下的,Django 的 ORM 有一个 select_related 方法解决一对多的 1+N 查询,prefetch_related 方法解决多对多的 1+N 问题。实际上翻译成 sql 语句后也是使用 join,我想 Java 里面的框架应该也有类似的解决方案。希望能帮到楼主。
    ydc886
        4
    ydc886  
    OP
       2019-04-21 16:08:12 +08:00
    @shihaoyu 嗯,各类方法的实质上也是 join,或者会话期间懒加载拿数据。这也是流行的 ORM 框架的基本功能。
    ydc886
        5
    ydc886  
    OP
       2019-04-21 16:32:28 +08:00
    @reus 哈哈,这类操作就是很基础的东西,怎么写都行。这类 name 或者 sex 之类没什么业务逻辑的字段,取出来也就塞在 VO 中一个新的域,某个领域对象是业务核心对象,那么其查询时关联一些数据要挺多,这出现的是 join 多了,sql 变长了。就在找个折衷点。标题也不是很恰当。JPA 的 EntityGraph,Spring JPA 的 projections,这些我理解也是对这种场景的抽象。
    ydc886
        6
    ydc886  
    OP
       2019-04-21 16:39:38 +08:00
    再者,这东西稍微再扩展一下。几张表不在一个同一个 schema,又怎么玩。这些东西日常刷刷写,也想提炼一下,但是没想到如何描述,在搜索引擎就困难找到相关的 blog,就希望作为一个问题,看大家给一些 keyword,让我按图索骥。
    TommyLemon
        7
    TommyLemon  
       2019-04-21 17:50:44 +08:00
    APIJSON,自动化接口和文档 ORM 库,
    支持 LEFT JOIN, RIGHT JOIN, INNER JOIN, OUTTER JOIN, FULL JOIN, APP JOIN。
    前端只要传一个 join 键值对,例如 "join":"</User/id@" ,
    后端就自动生成了 JOIN 的 SQL 语句,如果用的是 APP JOIN
    例如 "join":"@/User/id@" ,则会自动实现第 2 中方式,
    从主表去除所有关联字段的值 refKey,组成数组 refKeys,
    然后对副表生成 id IN($refKeys) 自动优化性能。
    注意,后端没有写任何一行代码,以上过程就自动完成了!



    码云最有价值开源项目
    后端接口和文档自动化,前端(客户端) 定制返回 JSON 的数据和结构!
    GitHub 右上角点 Star 支持下吧 ^_^
    https://github.com/TommyLemon/APIJSON
    icaca
        8
    icaca  
       2019-04-21 19:39:36 +08:00
    写个视图吧 用 orm 框架查询视图 还能解决排序的问题
    TommyLemon
        9
    TommyLemon  
       2019-04-22 12:07:17 +08:00
    @icaca 视图是要开发和维护成本的,看 #7 回答,很好的方案
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2548 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 15:08 PVG 23:08 LAX 08:08 JFK 11:08
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86