如何在数据库中存储基于对象的数据,以便它仍然可查询?

时间:2015-02-12 16:27:14

标签: php database oop object

我正在从头开始构建一个PHP框架(不幸的是我在这个问题上没有任何选择)。该框架需要严重依赖面向对象的数据,因此需要能够有效地存储大量面向对象的数据。

我正在努力解决第二部分问题。

我已经为此工作了几个月。最初我被介绍了ORM的想法,在尝试了一些预先构建的库(Doctrine 2,Redbean等)之后,我很喜欢这个想法,但是我找不到的东西都是按照要求的方式运行的,所以我开始创建我自己的ORM,结果非常好。唯一的问题是它在性能方面受到影响,在花了一些时间试图优化它之后,我现在确信ORM不是解决问题的方法。虽然很接近,但它并没有完全削减它。

我已经简要介绍了其他解决方案,但由于我在这方面缺乏经验,我很难确定解决方案。

以下是数据存储引擎的要求:

  • 最终,它需要能够存储键值对
  • "价值" part可以是一个简单的数据类型,但也可以是一个对象,或者是同一类型对象的数组。
  • 应用程序定义每个对象(或SCHEMA)的结构,其方式与.wsdl文件的工作方式相同,因此引擎需要使用严格的格式。
  • 对象可以重新使用它们的实例。这意味着如果一个对象作为子对象存在于多个位置(跨越许多对象),则其值在任何位置都是相同的(如果它重新使用)。否则,每个现有对象(未重复使用)都存在该对象的新实例。
  • 需要能够有效地查询数据,对对象的任何部分进行比较才能找到它。例如:find a customer where customer.address.postcode LIKE ('%XXX%')

任何建议都将不胜感激

修改

感谢那些曾经试图在我疯狂的努力中帮助我的人。回答迄今为止提出的一些问题:

您尝试了哪些解决方案,为什么它们不起作用?

ORM系统

我曾尝试过少量用于PHP的预构建ORM库。包括Doctrine 2和Redbean。使用Doctrine,更多的是如何指定模型的SCHEMA,因为您需要在docblock中执行此操作。由于我的要求,我发现使用起来特别笨拙,特别是因为我知道有很多方法可以避免这种情况。我最终设法让Doctrine以我想要的方式工作,但这是在破解代码之后。再次,这很有趣,但它不对。

Redbean主动要求我更改对象的属性名称。我的一个要求是基本上能够插入任何类型的面向文档的对象,并存储它。因此,为了做到这一点而必须专门命名属性是违反直觉的。再一次,我确实和Redbean玩了一段时间才能让它发挥作用,这是不对的。

在玩了几个ORM系统后,我觉得我有自己的知识。同样,我制作的ORM系统很好,因为它精确地满足了要求。由于性能不佳,特别是在处理大量数据时,它被大量放弃,但在处理大部分复杂的模型时更是如此。

将对象存储在XML文件中

有一段时间我考虑过这个问题,认为我的要求可能意味着我总是最终会遇到性能问题。因此,我开始设计一种生成基于文本的存储的方法,最终最终创建了一个完整的SCHEMA引擎和一堆其他有趣的东西。事实证明这最终只是一个有趣的项目,我根本无法让它完成任务。

的NoSQL

我最近的努力让我走上了MongoDB和其他一些NoSQL系统这样的系统,我没有像Cassandra那样进入。

MongoDB非常接近我可以使用的工具,但是它需要我添加一个额外的层,因为我实际上需要一个SCHEMA,因为我的对象总是符合特定的结构体。我正在慢慢地与MongoDB达成协议可能是解决方案,但是我想确保在我花更多时间在这之前。

你到底有什么意思?

当我提到效率时,我不是100%谈论性能,虽然性能肯定是我用来考虑我的选项的一个重要因素,我明白走下这条路线而不是关系数据库之类的东西,性能自然会成为一个问题。

我更谈论使用正确的工具。我从不喜欢破解别人的代码来让事情发挥作用。对我来说,感觉好像我正在推动系统没有被设计成下降的道路,并且在未来的某个时刻它会让我陷入困境。

所以,实际上,当我提到我正在寻找一些东西"高效"时,我意味着工具尽可能地匹配要求,因此我只使用/扩展功能,而不是重写它。

1 个答案:

答案 0 :(得分:0)

以下是一些需要研究的路线。您对存储"对象的要求" (在涉及数据库方面相当广泛的术语)让我想到:

  • 以序列化格式在数据库中存储数据,例如JSON。 PostgreSQL这些天has ways to reach into such a column对它进行搜索操作,所以它不像之前所认为的那样是不可搜索的(尽管我认为它比正确查询规范化数据要慢)。
  • 存储customer.address.postcode的要求使我认为您可以将数据存储为层次结构,在这种情况下,您可以使用多种算法。看看nested sets。这适用于关系数据库,无需借助递归SQL。
  • 这不是我的专业领域,但graph databases可能值得研究。

另一方面,Doctrine是我所听到的一个很棒的图书馆,但我怀疑你需要先弄清楚要使用哪种技术。它被广泛地设计为映射到关系数据库,因此如果您无法在原始RDBMS中干净地表达您的问题,那么Doc​​trine可能无济于事。

(这可能是XY question,很难说。你说你需要Y,但是如果你能告诉我们你想要获得X,那么你可能会得到反馈#39;重新获得会​​更具体 - 并带你走向更好的方向。)