具有特殊要求的对象关系映射(选择基础+所有子对象,......)

时间:2012-07-29 18:27:56

标签: database oop database-design orm relational-database

我有以下PHP类结构:

enter image description here

我想将对象保存在数据库中(MySQL,MSSQL,postgreSQL和所有标准提供商提供)。

我的要求是:

  1. 所有electric_devices /所有计算机/笔记本的列表...包括子类的对象,所有属性属于具有过滤器和订单可能性的对象(所有属性的过滤器)
  2. 通过ID选择单个记录
  3. 在数据库结构中插入新对象(阅读比写作更重要)
  4. 没有太多的连接和尽可能少的数据库请求
  5. 我找到了一些可能性,但没有一个符合我的所有要求:

    1. 类表继承:获取包括子类在内的所有项目非常复杂,我无法找到自动方式(因此我没有为每个子类定义单独的连接语句)来生成正确的连接。另一个问题:如果你想通过ID找到一个对象,你就不知道你必须使用哪个连接路径。
    2. 单表继承:太多不同的属性 - >空字段
    3. 具体表继承:用于搜索所有项目,您必须执行许多数据库请求,因为UNION需要相同数量的列
    4. EAV:如果需要过滤器1加入/属性 - >性能会非常糟糕(有可能只是加入过滤器属性而其余部分是行吗?)
    5. NoSQL数据库:没有提供商(服务器太贵,我不想关心管理)
    6. postgreSQL内置继承:不按我需要的方式工作(从可以列出所有electric_devices的基础,但只是常用属性)
    7. 信息:

      • 存储对象的总数约为100
      • 完整的属性数量(~100)将很少改变
      • 许多属性都预定义了多个选择值
      • 每个对象具有20到50个可能的属性

      最后对我来说没有办法,但我认为必须有可能,其他门户网站以相同的方式(例如eBay或任何小型广告门户网站)这样做,可能我已经考虑过这么多,我不知道#39;看到最简单的方法。

      是否有满足所有要求的方法?

      感谢您的帮助(链接,关键字......),如果问题不明确,请询问。

2 个答案:

答案 0 :(得分:1)

您可能没有仔细查看类表继承。特别是,您应该查看子类表如何填充其ID字段。它不是自动编号。它是相应超类的ID字段的副本。这是“穷人的遗产”。编程插入新项目有点复杂,但您需要的连接是光滑,简单和快速的。您所要做的就是在连接条件中使用子类的ID和超类的ID,然后就完成了。

您可以创建5个视图来为您的案例加入广义属性和专用属性。

答案 1 :(得分:0)

正如您为研究列出的no-sql: mongodb说,我认为这对你来说是一个非常简单的解决方案。 满足您对这种情况的要求,并且有针对对象映射的简洁解决方案,例如Doctrine ODM。 此外,托管绝对是可用的,例如http://dotcloud.com。虽然我不知道你有什么预算可用。有了这个提供者,你将从appr开始。每月8美元。