关系型数据库最难的地方,就是建模

关系型数据库最难的地方,就是建模(model)。
错综复杂的数据,需要建立模型,才能储存在数据库。所谓模型就是两样东西:实体(entity)+ 关系(relationship)。
实体指的是那些实际的对象,带有自己的属性,可以理解成一组相关属性的容器。关系就是实体之间的联系,通常可以分成一对一、一对多和多对多等类型。
在关系型数据库里面,每个实体有自己的一张表(table),所有属性都是这张表的字段(field),表与表之间根据关联字段连接(join)在一起。所以,表的连接是关系型数据库的核心问题。
表的连接分成好几种类型。
内连接(inner join)
外连接(outer join)
左连接(left join)
右连接(right join)
全连接(full join)
以前,很多文章采用维恩图(两个圆的集合运算),解释不同连接的差异。
上周,我读到一篇文章,认为还有比维恩图更好的解释方式。我发现确实如此,换一个角度解释,更容易懂。
所谓连接,就是两张表根据关联字段,组合成一个数据集。问题是,两张表的关联字段的值往往是不一致的,如果关联字段不匹配,怎么处理?比如,表 a 包含张三和李四,表 b 包含李四和王五,匹配的只有李四这一条记录。
很容易看出,一共有四种处理方法。
只返回两张表匹配的记录,这叫内连接(inner join)。
返回匹配的记录,以及表 a 多余的记录,这叫左连接(left join)。
返回匹配的记录,以及表 b 多余的记录,这叫右连接(right join)。
返回匹配的记录,以及表 a 和表 b 各自的多余记录,这叫全连接(full join)。
下图就是四种连接的图示。我觉得,这张图比维恩图更易懂,也更准确。
上图中,表 a 的记录是 123,表 b 的记录是 abc,颜色表示匹配关系。返回结果中,如果另一张表没有匹配的记录,则用 null 填充。
这四种连接,又可以分成两大类:内连接(inner join)表示只包含匹配的记录,外连接(outer join)表示还包含不匹配的记录。所以,左连接、右连接、全连接都属于外连接。
这四种连接的 sql 语句如下。
select*fromainnerjoinbona.book_id=b.book_id;select*fromaleftjoinbona.book_id=b.book_id;select*fromarightjoinbona.book_id=b.book_id;select*fromafulljoinbona.book_id=b.book_id;
上面的 sql 语句还可以加上where条件从句,对记录进行筛选,比如只返回表 a 里面不匹配表 b 的记录。
select*fromaleftjoinbona.book_id=b.book_idwhereb.idisnull;
另一个例子,返回表 a 或表 b 所有不匹配的记录。
select*fromafulljoinbona.book_id=b.book_idwherea.idisnullorb.idisnull;
此外,还存在一种特殊的连接,叫做交叉连接(cross join),指的是表 a 和表 b 不存在关联字段,这时表 a(共有 n 条记录)与表 b (共有 m 条记录)连接后,会产生一张包含 n x m 条记录的新表(见下图)。

DC3系列开关高压输入DC-DC电源PICO
扫拖机语音芯片,工业级内置存储可重复烧录语音ic,WT2003H4-16S
使用高速微型的串行端口
营收6000亿 透过华为战略看风口
浅谈北方高校能耗现状与节能建议
关系型数据库最难的地方,就是建模
网络变压器耐压强度/电阻检测仪的特点及优势
2021年手机市场回温,TDDI IC需求持续扩大
如何焊好0.5mm间距的引脚?
放大器电路图分享
飞兆半导体的阳极短路IGBT荣膺EPC十佳功率产品奖
汽车产业下滑后 自动化供应商如何把握机遇
索尼与松下将联合开发生产新一代OLED电视?
IEC第82届大会研讨AI相关领域的技术趋势和市场需求并开展IEC技术展望
单片机程序的几种常用下载方式介绍
Intel正研发新型笔记本散热方案 号称散热性能可提升25-30%
去年Q4营运创新高 2019可能是台积电难过的一年
12v1A电源芯片U6210推动创新精简设计
基于电流采样运放的DCDC电源输出线损补偿电路的详细推导计算
几大半导体新兴城市你追我赶 给传统“三超”带来了挑战