2013-08-12 158 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,這仍然應該足夠多。