支持JOIN的数据库和灵活的数据模式

时间:2013-08-12 11:00:06

标签: database

对于我们的项目,我们需要一个支持JOIN的数据库,并且能够轻松添加和修改实体的属性(无架构/免费)。要点:

  • 该系统旨在与客户(CRM)合作
  • 基本实体:用户,客户,案例,案例互动,订单
  • 目前在数据库中有大约20万客户和~250k订单
  • 客户实体包含15-20个通常未填充的可选属性
  • 每天约100个新病例
  • 数据与后台的其他几个来源同步

要求(从高到低的优先级):

  1. 能够通过相关实体实施搜索/排序,例如案例由关联的客户名称(支持JOINs)
  2. 具有更改数据架构的灵活性,并且不会为大量属性存储NULL
  3. 表现
  4. 用于Python的ORM,支持监视更改以及仅存储对数据库的更改的可能性
  5. 我们尝试了什么:

    • MongoDB不满足第1段。
    • 具有一个表中所有属性的PostgreSQL不满足第2段。
    • PostgreSQL每个属性或EAV都有一个单独的表,不满足第3段(很多慢连接),但似乎比其他更好的解决方案。

    您能否建议任何符合我们需求的系统数据库或设计?

2 个答案:

答案 0 :(得分:1)

Datomic可能值得一试(http://www.datomic.com/)。它满足要求1-3,虽然没有python ORM,但有一个REST API。

Datomic基于实体属性值架构(它不是完全无架构的 - 您需要为每个属性指定名称和类型 - 但任何实体都可以具有任何属性)。它是事务性的,并且支持连接,不像其他一些灵活的“NoSQL”解决方案。有趣的是,它还具有一流的时间支持(例如,该实体的历史/数据库在时间t的外观如何等),如果您跟踪案例和交互,这可能很有用。

查询基于数据记录,通过统一查询。统一查询起初看起来有点奇怪但是一旦你习惯它就很棒。

例如,按链接的客户名称查找案例的查询将是这样的:

[find ?x
 :in $
 :where [?x :case/linked-customers ?c
         ?c :customer/name "Barry"]]

查询引擎在数据库中查找,并尝试通过统一给定变量的所有实例来满足where子句。在这种情况下,只有?c出现两次(案例中有一个名为Barry的链接客户c),但查询显然会变得更加复杂。这里的$代表数据库。

答案 1 :(得分:1)

您可能需要考虑将“灵活”部分存储为XML。一些数据库,例如DB2允许XML索引,因此查找性能应该与关系数据存储一样好。 DB2 Express-C是免费的,对数据库大小没有人为限制。

更新自2015年以来,DB2 Express-C将数据库用户数据量限制为15 TB,这仍然应该足够。