大家在工作中遇到多对多实体关系时的表结构都是如何设计的? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jayn1985
V2EX    数据库

大家在工作中遇到多对多实体关系时的表结构都是如何设计的?

  •  
  •   jayn1985 2017-03-30 14:29:42 +08:00 1842 次点击
    这是一个创建于 3199 天前的主题,其中的信息可能已经有所发展或是发生改变。
    题主在上学读书期间学习数据库课程时,涉及到多对多关联的表结构设计都是采用标准化的解决方式,即增加一张关联表用以保存两个实体之间的联系(例如经典的 student / course / student_course_mapping 这样三张表)
    然而在实际工作中,发现系统的业务逻辑较为复杂时(实体之间多对多关系的场景比较普遍),数据库中会充斥很多这样的关联表,然后为了实现页面上某个较为复杂的查询操作,往往需要 join 多张表才能满足需求,以学生 /课程的景为例,为了查询某个班所有学生所选修的课程的详细信息,就至少需要 join 上述三张表,如果页面上需要查询的条件更多,那么还要再 join 更多的表才能满足一次查询要求,这样显然会大大增加 SQL 语句的执行时间,不知道大家在工作中遇到这样的情况,都有什么好的实践方案么?
    题主之前也使用过空间换时间的方案,也即把这样多对多的关系拆分成两个一对多的关系,不知道是否存在更优的解决方案?

    PS :顺带请教另一个问题,一个页面中如果存在着非常复杂的查询条件,例如需要模糊查询某个人的名字、某个地点,以及其他一些精确检索条件,对于多个模糊搜索(诸如 like '%XXX%')条件如果做优化才能最大程度的保证 SQL 执行性能?
    4 条回复    2017-03-30 16:31:46 +08:00
    buliugu
        1
    buliugu  
       2017-03-30 15:56:55 +08:00
    异常复杂的搜索条件就上 solr 吧,或者 es
    jimzhong
        2
    jimzhong  
       2017-03-30 16:24:22 +08:00
    模糊搜索似乎不是 SQL 的强项。
    我也很好奇多个表 Join 怎么优化。
    awanabe
        3
    awanabe  
       2017-03-30 16:29:22 +08:00
    可以在 mapping 表冗余 a,b 表的数据。
    如果 a , b 表更新不多的话, 可以把 a , b 数据存入缓存( redis )中。
    到时候只要去对应关系+缓存即可,单表查询会很快。

    join 优化,就是在执行的时候, 尽可能不要出现大表 x 大表的全表扫描情况。。这样笛卡尔乘积爆炸。
    Sharuru
        4
    Sharuru  
       2017-03-30 16:31:46 +08:00
    比起性能更注重关系。
    通过 ER 图直接生成对应实体 Entity ,使用 ORM 的方法去 get 想要的数据。

    至于性能?堆硬件。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2195 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 16:04 PVG 00:04 LAX 08:04 JFK 11:04
    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