php – 关系数据库中面向对象的结构
伙计们,
连续第n次,我再次遇到同样的老问题.它是关于“如何以无痛的方式将OOP结构映射到数据库表”. 这是一个场景:我的系统中有几种类型的“演员” – 工人,雇主,联系人.他们有一些共同的功能;其他的作品有很大的不同.所有演员处理的实体是“通信”,“笔记”(管理员喜欢留下客户的笔记)等等.每个演员类型处理的其他实体有多种类型,而其他实体则不同. 目前,我的数据库模式包括: 演员: >工人 实体: >沟通 实体和演员之间的关联表: >工人沟通 这感觉像是一个“代码气味”给我.每当客户改变角色(即从“联系人”提升为“雇主”)时,需要运行一堆疯狂的脚本. Yuck …另一方面,如果我在纯粹的OOP驱动的世界中运行,这将会更容易 – 拥有所有具有共同属性的实体的基类,并且可以完成它… 在数据库世界中,这个选择似乎在理论上是可能的,但听起来很混乱.如果我理解这个权限,我会有一个新的base_actor表,每个其他actor都有一个base_actor_id,然后这个关联将在base_actor和实体之间…然后,我如何进行反向关联查询?即“告诉我所有与类型工作者的沟通”? 任何建议?关于“将OOP结构映射到关系数据库”这一主题的一般想法?
这是一个大概10年前提出的解决方案.使用这种设计的系统仍在运行,所以它运行得很好,比我的大部分代码都要长. ;)今天我可以使用Scott提到的一个ORM包,但直接使用SQL的确没有什么大问题.
>将所有的继承关系建模为表之间的连接.系统中的每个表都将保存特定类的属性. 没有成员属性的虚拟类可以在表结构中跳过,但是您将无法根据这些类进行查询. 这就是“告诉我所有与刚才的工作人员的沟通”,看起来像. 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,shoutout s where c.actor=w.oid and c.oid=s.oid; 最后一件事.确保你有一个良好的数据库和正确的索引.如果数据库无法优化这些连接,性能可能会是一个严重的问题. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |