数据库设计 – 如何为关系数据库中不同类型的对象建模公共数据?

在当前的项目中,我们正在创建一个应用程序,其中包括客户,项目,公司,票证,请求等.这些模型很简单.我无法理解的复杂部分如下:

我们希望有一些可以“附加”到各种对象的公共实体.一些示例包括文档,标签和注释.对于上述每个域实体,每个都应该是可管理的.

在服务器端代码(Java)中,我们希望将通用功能实现为组件,并将它们重用/嵌入到域对象的特定编辑页面上.我们正在使用ORM,并且还想重用那些“元数据”类.

我认为这个用例很容易用文档数据库建模.
但是如何在关系模型中完成呢?

最佳答案
您要求的是一种使关系数据模型适合任意代码约束的方法,即:所有“附加”项使用单个ORM类.我不会告诉你如何做到这一点,而是试着解释为什么这不是一个好主意,而是你应该做些什么.

代码重用是应用于代码的一个重要原则.数据不是代码,关系数据库不应主要设计用于促进代码重用.您应该为数据完整性设计数据库而不是代码重用.设计数据完整性意味着您应该以不同的方式处理不同类型的事物,即使它们恰好在目前“看起来相似”.这就是关系数据库的设计和构建.它们不是为优化代码重用而设计的.

此外,ORM代码通常不可重用,因为它旨在反映特定表的结构和操作.即使您碰巧有多个表在结构上看起来都相似,即使您定义了允许这些表通过一组通用代码的接口,您仍然需要将数据保存在不同的表中.还有ORM代码生成器的问题,它们不是为了寻找代码重用机会而构建的,就像你想要实现的那样.

你可以想象开发自己的ORM(我自己在1990年代建造了一个).如果你这样做,你可以建立它,使其在运行时驱动元数据.这将使您在将代码存储在关系数据库中时,可以在代码中使用文档数据库.然而,你真正在做的是将方形钉子捣成圆孔.如果您的应用程序需要文档数据库,那么最好使用一个而不是关系数据库.

您可以(也可能应该)尝试实现的最好的方法是创建中间层/模型代码(以及前端/视图,如果可能)的可重用代码组件,它们在后端/数据层内部分支到使用每个表ORM类.这使您可以实现使用关系数据库的好处,使用ORM实现持久性代码的好处,以及业务层和用户界面代码中组件的优势.

转载注明原文:数据库设计 – 如何为关系数据库中不同类型的对象建模公共数据? - 代码日志