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

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

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

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

至于性能?堆硬件。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/351467

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX