【问题标题】:Database with support for JOINs and a flexible data schema支持 JOIN 和灵活数据模式的数据库
【发布时间】:2013-08-12 11:00:05
【问题描述】:

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

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

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

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

我们尝试过的:

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

您能推荐任何满足我们需求的数据库或系统设计吗?

【问题讨论】:

    标签: database


    【解决方案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),但查询显然会变得复杂得多。这里的$ 代表数据库。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2011-06-03
        • 1970-01-01
        • 1970-01-01
        • 2012-03-22
        • 2012-06-17
        • 1970-01-01
        • 1970-01-01
        • 2018-01-15
        • 2016-10-20
        相关资源
        最近更新 更多