请教大佬们一个数据库的查询问题

2020-06-03 18:11:35 +08:00
 Visitor233

现开发过半的表结构

表 A AId AName 表 B BId BName AId 表 C CID CName BId 表 D DID DName CID

问题点

例如:我现在查个 D 表数据,但需要额外显示 BName 的信息,就得 join 两次。 可实际上一个 select 得做四五次这样的 join,项目现有的查询一大半都是这种,重复度颇高, 而且来来回回就是那六张表。

结语

我今天和项目负责人说了,他也觉得这种设计整个查询麻烦,但他也想不出什么办法。 V 友们说说看,怎么整好些

业务场景:学校。 这几个表就是查询,增删改很少 PS:想过 sql CTE,没写出来

1777 次点击
所在节点    程序员
14 条回复
aragakiyuii
2020-06-03 18:33:50 +08:00
join ;查一个表再 byIds 去查另一个表;把 a,b,c 表的字段冗余到 d 中;改需求😂
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;

我司现状
luckyx
2020-06-03 21:23:29 +08:00
人生苦短, 我用 neo4j (不是
akira
2020-06-03 21:32:25 +08:00
新建一个表,叫 ABCD, 字段是 aid,bid,cid,did,aname,bname,cname,dname.
这个表的数据从 a b c d 定时或者实时更新进来。
打完 收工
PopRain
2020-06-03 21:37:14 +08:00
也不一定非要用数据库范式,现在存储根本不是问题,主表数据写入从表也是一个办法( NAME 写入时一起写到子表)
JunoNin
2020-06-03 21:41:32 +08:00
同五楼,多写入一次 name 到查询较多的表
chanchan
2020-06-03 21:53:38 +08:00
是一对多的话就应该这样,在这种地方偷懒,肯定会在另外一个地方带来麻烦
hsk9044
2020-06-04 09:40:09 +08:00
其实这也根本不是问题, 就像 5 楼说的, 仅是增加几个字段就能解决的事情, 考虑的太复杂以后反而不好拓展. 单前提是热点字段才可以这样冗余, 如果整 B 表都是热点数据, 那你除了查询时做关联没比较好的办法. 或者就是业务层分开查询了
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;
Visitor233
2020-06-04 18:24:28 +08:00
@aguesuka 视图也行
Visitor233
2020-06-04 18:26:00 +08:00
@akira 数据量多,你这法子可以考虑,我忘了补充,这 6 张表加起来的数据才 1000 来条
Visitor233
2020-06-04 18:30:08 +08:00
@PopRain 反范式这个好像可以考虑下,经常用但数据量少的 A B C 三表加起来也不过 100 条
Visitor233
2020-06-04 18:32:27 +08:00
@taogen 谢谢,一时还没看懂你的 sql 语句,不过我觉得会派上用场的
akira
2020-06-04 18:36:10 +08:00
@Visitor233 其实吧,个人建议是,做数据库设计的时候,第一步就是把三范式给忘掉。

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

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

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

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

© 2021 V2EX