2013-08-12 161 views
0

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

  • 该系统的设计与客户(CRM)
  • 基本实体合作:用户,客户案例,案例互动,令
  • 目前在数据库中有〜20万级的客户和〜 250K的订单
  • 客户实体包含15-20是最常未填写
  • 约100天
  • 的数据在后台几个其它来源的同步新病例可选属性

要求(高到低优先级):

  1. 能力来实现搜索/排序相关实体,例如此案经联客户名称(支持连接)
  2. 由于可以灵活更改数据的模式,并没有为大量属性的存储空
  3. 性能
  4. ORM的Python与变化的监测和支持仅存储更改数据库

的可能性,我们已经试过:

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

你能提出任何数据库或系统的设计,以满足我们的需求吗?

回答

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

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

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