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

关系数据库中类似面向对象的结构,第1张

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

这是我大约十年前提出的解决方案。使用该设计的系统仍在运行,因此与我的大多数代码相比,它可以很好地生存。;)今天,我可能会使用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;

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



欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5014722.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-11-14
下一篇2022-11-15

发表评论

登录后才能评论

评论列表(0条)

    保存