当前位置: 首页 > 面试题库 >

关系数据库中类似面向对象的结构

曾枫
2023-03-14
问题内容

民间,

我连续第n次遇到相同的老问题。这是关于“如何轻松地将OOP结构映射到数据库表”。

这是一个场景:系统中有几种类型的“角色”-工人,雇主,联系人。它们具有某些共同的功能。其他部分则大不相同。所有参与者所处理的实体是“交流”,“注释”(管理员喜欢在客户身上留下注释)等。每种角色类型都处理大量其他类型的实体,而其他类型则不。

当前,我的数据库模式包括以下表:

演员:

  • 工人
  • 雇主
  • 联系

实体:

  • 通讯
  • 笔记
  • 等等

实体和参与者之间的关联表:

  • 工人交流协会
  • 雇主交流协会
  • 工人笔记
  • 等等,您就可以开始练习了。

对我来说,这感觉像是一种“代码气味”。每当客户更改其角色时(即从“联系人”升级为“雇主”),都需要运行大量疯狂的脚本。uck
…另一方面,如果我在一个纯粹的OOP驱动的世界中工作,这会容易得多-为具有公共属性的所有实体都拥有一个基类,并以此为基础…

在数据库世界中,该选项在理论上似乎是可行的,但是听起来很混乱……也就是说,如果我理解这一权利,我将拥有一个新的base_actor表,并且每个actor都将具有base_actor_id,然后关联将在base_actor和实体…但是,如何执行反向关联查询?即“向我展示与类型工作者的所有交流”吗?

有什么建议吗?关于“将OOP结构映射到关系数据库”有什么一般想法?


问题答案:

这是我大约十年前提出的解决方案。使用该设计的系统仍在运行,因此与我的大多数代码相比,它可以很好地生存。;)今天,我可能会使用Scott提到的ORM软件包之一,但是直接使用SQL确实没有大问题。

  1. 将所有继承关系建模为表之间的联接。系统中的每个表都将包含特定类的属性。

  2. 使用合成对象ID(oid)作为所有对象的主键。序列生成器或自动增量列对于生成oid值是必需的。

  3. 所有继承的类必须使用与其父类相同的oid类型。使用级联删除将oid定义为外键。父表获取自动增量oid列,子表获取普通oid列。

  4. 有关最终类的查询在相应的表上进行。您可以将所有父类表加入查询中,也可以延迟加载所需的属性。如果您的继承层次结构很深并且您有很多类,那么ORM包可以真正简化您的代码。我的系统有少于50个类,最大继承深度为3。

  5. 跨子类的查询(即,对父类的查询)可以按实例延迟加载子属性,也可以对与基类连接的每个子类重复查询。根据父类查询延迟加载子属性需要您知道对象的类型。父类中可能已经有足够的信息,但是如果没有,则需要添加类型信息。同样,这是ORM软件包可以提供帮助的地方。

没有成员属性的虚拟类可以在表结构中跳过,但是您将无法基于这些类进行查询。

这就是“向我展示与类型工作者的所有交流”的样子。

select * from comm c, worker w where c.actor=w.oid;

如果您有通信的子类,并且要立即加载所有子类属性(也许您的系统不允许部分构造),则最简单的解决方案是急于加入所有可能的类。

select * from comm c, worker w, missive m where c.actor=w.oid and c.oid=m.oid;
select * from comm c, worker w, shoutout s where c.actor=w.oid and c.oid=s.oid;

最后一件事。确保您具有良好的数据库和正确的索引。如果您的数据库无法优化这些联接,则性能可能是一个严重的问题。



 类似资料:
  • 使用table()方法查看结构化数据并比较数据对象。 table()方法提供了一种简单的方法来查看包含类似数据的对象和数组。当调用时,它将获取到的对象属性创建为标题。每一行数据来自每个索引下的属性值。 基本示例: 记录对象的数组 在它最基本的形式中,你需要的是一个具有相同属性的对象数组。 table() 命令将完整剩下的工作: console.table([{a:1, b:2, c:3}, {a:

  • 我在谷歌上搜索过,找不到任何可以在O(1)时间内存储和读取双向数据的DS。例如书籍和作家。有了书的名字,就必须找到作者。有了作者的名字,就必须找到书。 在数据库中,这些关系(如联接表)是如何存储的? 提前谢谢。

  • 问题内容: 在像mySQL这样的RDBMS数据库中处理多对多关系的最佳方法是什么? 尝试使用数据透视表来跟踪关系,但这会导致以下任一情况: 规范化被抛在后面 空或空的列 您采取了什么方法来支持多对多关系? 问题答案: 在 专门针对该关系 的 表 (有时称为 联结表 )中跟踪多对多关系。该表将该关系建模为指向相反方向的两个一对多关系。 然后,您可以使用联结表通过外键 通过它 联接 其他表 。

  • 本文向大家介绍对象关系数据模型,包括了对象关系数据模型的使用技巧和注意事项,需要的朋友参考一下 对象关系模型是面向对象的数据库模型和关系数据库模型的组合。因此,它像面向对象的模型一样支持对象,类,继承等,并支持数据类型,表格结构等,例如关系数据模型。 对象关系数据模型的主要目标之一是缩小关系数据库和许多编程语言(例如C ++,C#,Java等)中经常使用的面向对象实践之间的差距。 对象关系数据模型

  • 问题内容: 我想知道jQuery如何构造其类似数组的对象。我试图解决的关键问题是如何设法使控制台将其解释为数组并将其显示为数组。我知道它与length属性有关,但是在玩了一点之后我还是不太清楚。 我知道,与普通的数组(如下面的示例)相比,它没有技术优势。但是我认为这是用户进行测试和调试时的重要语义元素。 像对象一样的普通数组。 jQuery输出的位置 如果你跑 jQuery对象的原型特别有趣,因为

  • 我正在将nTier架构迁移到六边形架构中。我的域现在定义得很好,我有所有基础设施依赖项的接口。查看数据库存储库,我有几个数据库,在下面的一侧有一个类实现每个repo。我的问题是关于数据库依赖项的正确方法是什么: 1-在域端有一个接口来处理数据访问,然后依赖于基础设施实现,并有一个类作为所有数据库存储库的入口点,就像一个facade,从那里调用所有存储库实现。这种方法与我在nTier应用程序中已经使