0

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

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

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

  1. 能够按相关实体实现搜索/排序,例如按链接客户名称的案例(支持 JOIN)
  2. 具有更改数据架构的灵活性,并且不会为大量属性存储 NULL
  3. 表现
  4. ORM for Python,支持监视更改并可以仅将更改存储到数据库中

我们尝试过的:

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

您能否建议任何可以满足我们需求的数据库或系统设计?

4

2 回答 2

1

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

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

于 2013-08-12T11:42:41.873 回答
1

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

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

查询基于datalog,统一查询。统一查询一开始看起来有点奇怪,但是一旦你习惯了它就很棒。

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

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

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

于 2013-08-12T11:35:33.857 回答