表 A AId AName 表 B BId BName AId 表 C CID CName BId 表 D DID DName CID
例如:我现在查个 D 表数据,但需要额外显示 BName 的信息,就得 join 两次。 可实际上一个 select 得做四五次这样的 join,项目现有的查询一大半都是这种,重复度颇高, 而且来来回回就是那六张表。
我今天和项目负责人说了,他也觉得这种设计整个查询麻烦,但他也想不出什么办法。 V 友们说说看,怎么整好些
业务场景:学校。 这几个表就是查询,增删改很少 PS:想过 sql CTE,没写出来
1
aragakiyuii 2020-06-03 18:33:50 +08:00 via Android
join ;查一个表再 byIds 去查另一个表;把 a,b,c 表的字段冗余到 d 中;改需求😂
|
2
aguesuka 2020-06-03 18:56:32 +08:00
create view GOD select * from a join b join c join d join d join e join f;
我司现状 |
3
luckyx 2020-06-03 21:23:29 +08:00
人生苦短, 我用 neo4j (不是
|
4
akira 2020-06-03 21:32:25 +08:00
新建一个表,叫 ABCD, 字段是 aid,bid,cid,did,aname,bname,cname,dname.
这个表的数据从 a b c d 定时或者实时更新进来。 打完 收工 |
5
PopRain 2020-06-03 21:37:14 +08:00
也不一定非要用数据库范式,现在存储根本不是问题,主表数据写入从表也是一个办法( NAME 写入时一起写到子表)
|
6
JunoNin 2020-06-03 21:41:32 +08:00 via Android
同五楼,多写入一次 name 到查询较多的表
|
7
chanchan 2020-06-03 21:53:38 +08:00
是一对多的话就应该这样,在这种地方偷懒,肯定会在另外一个地方带来麻烦
|
8
hsk9044 2020-06-04 09:40:09 +08:00
其实这也根本不是问题, 就像 5 楼说的, 仅是增加几个字段就能解决的事情, 考虑的太复杂以后反而不好拓展. 单前提是热点字段才可以这样冗余, 如果整 B 表都是热点数据, 那你除了查询时做关联没比较好的办法. 或者就是业务层分开查询了
|
9
taogen 2020-06-04 11:53:30 +08:00
除了 1. denormalization (如 5 楼),2. 增加 cache table (如 4 楼),3. 还可以考虑添加索引 + SQL 优化:
如下: Index: D 表 index(c_id, dname) C 表 index(b_id, cname) B 表 index(a_id, bname) SQL: select D.*, B2.bname from D join (select cid, cname, b_id from C) as C2 on D.c_id = C2.cid join (select bid, bname from B) as B2 on C2.b_id = B2.bid; |
10
Visitor233 OP @aguesuka 视图也行
|
11
Visitor233 OP @akira 数据量多,你这法子可以考虑,我忘了补充,这 6 张表加起来的数据才 1000 来条
|
12
Visitor233 OP @PopRain 反范式这个好像可以考虑下,经常用但数据量少的 A B C 三表加起来也不过 100 条
|
13
Visitor233 OP @taogen 谢谢,一时还没看懂你的 sql 语句,不过我觉得会派上用场的
|
14
akira 2020-06-04 18:36:10 +08:00
@Visitor233 其实吧,个人建议是,做数据库设计的时候,第一步就是把三范式给忘掉。
|