多态关联
先说明什么是多态关联。
假设我们有一张地址表,其中的地址可能是对于User中的,也可能是对于Orders中的。
以上,只是举个例子,实际的例子还有很多,比如我们要设计一个内容管理系统(CMS),我们的CMS有一个文章表,一个软件表。还要求支持评论,那么我们的评论表的Id是引用文章表还是引用软件表呢?
对于以上例子的缺点,貌似书本上有故意为此多态关联的模式走软的嫌疑。缺点不说了,主要是查询麻烦,其次不能够支持外键约束。
解决方案
交叉表
对于这种需要外键引用为多个表的情况,可以建立一张交叉表。让Address不再依赖Orders或Users。
优点:
引用完整性支持。
缺点:
如果我们希望一个给定的地址,只能够在一张交叉表中出现一次,上面的复合主键已经做到了。如果希望一个地址可以在一张交叉表中出现多次,可以取消复合主键。但是不能够保证一个地址不在多张交叉表中出现,这需要我们再程序代码中实现。
实际上,多态关联与上篇文章提到的,实体-属性-值有关系。
如果前面采用的是类表的设计,根本不会出现这个问题,上面的地址,也可以依赖倒置。比如在Order表中添加一个AddressId、User表中添加一个AddressId解决。
假设,采用类表继承的方法。直接将Address用外键指向基表就OK了根本就没这个问题。书中的这一篇写得有点莫名其妙。既然我已经写完了,算了,不管了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现