引言
面向对象的三个特征: 封装(encapsulation), 继承(inheritance), 多态(polymorphic), 其中继承是我们三个特征中最重要的应该就是继承了.
我们在程序中可以很自然, 很方便的表达继承的关系. 但是针对这样的继承关系, 我们如何设计数据库呢?通常我们有三种方式:
1. 一个继承树映射到一个表(one inheritance tree mapping to one table)
这种方式是将拥有共同父类的所有的类都看做成一张表(包括父类), 然后所有的类的所有的属性取并集, 组成数据表的所有列.
如上图类的结构图, Vehicle是父类, 拥有两个属性Engine和wheel, 而子类Truck有属性Container, 子类Car有属性Acoustics.
数据表被映射成
类属性 | 数据表字段 |
Engine | Engine |
Wheel | Wheel |
Container | Contianer |
Acoustics | Acoustics |
优点: 结构简单, 在数据表操作层可以很方便的实现针对这三个对象的数据库的insert, update, delete.
缺点: 这样的设计数据表, 会有大量的数据冗余.
2. 一个继承路径映射一个表(one inheritance path mapping to one table)
按照这种方式: 创建两张表, 分别是Truck和Car.
Truck 数据表
类属性 | 数据表字段 |
Engine | Engine |
Wheel | Wheel |
Container | Container |
Car 数据表
类属性 | 数据表字段 |
Engine | Engine |
Wheel | Wheel |
Acoustics | Acoustics |
优点: 没有数据冗余.
缺点: 当需要查询Vehicle的时候, 就需要在Truck和Car两个表里面进行查询. 当有越多类继承Vehicle的时候, 查询的效率就越低.
3. 一个类映射到一个表(one class mapping to one table)
按照这种方式: 创建三张表, 分别是Vehicle, Truck和Car.
Vechile 数据表
类属性 | 数据表字段 |
ID(Primary Key) | |
Engine | Engine |
Wheel | Wheel |
Truck 数据表
类属性 | 数据表字段 |
ID(Foreign Key) | |
Container | Container |
Car 数据表
类属性 | 数据表字段 |
ID(Foreign Key) | |
Acoustics | Acoustics |
优点: 为每个类创建表, 子表和父表通过ID进行关联, 数据冗余小.
缺点: 当继承体系的非常复杂的时候, 一些sql语句会非常复杂, 效率也会非常低下.
其实在上面三种方式中, 我们使用最多的最常见的应该算是第三种, 但是有些情况下, 我们也需要考虑下其他数据表的创建方式.
毕竟模式是在一些特定的场合下, 才能充分体现它的价值. 我们在开发的过程中, 在类的设计方面愿意花费很多人力物力, 但是数据库的设计
我们似乎缺少些斟酌. 如果大家有建模上面有什么心得和高招, 多多交流.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述