0

私たちのプロジェクトでは、JOIN をサポートし、エンティティの属性を簡単に追加および変更できる (スキーマレス/フリー) データベースが必要です。キーポイント:

  • システムは顧客と連携するように設計されています (CRM)
  • 基本エンティティ: ユーザー、顧客、ケース、ケース インタラクション、注文
  • 現在、データベースには約 20 万件の顧客と約 25 万件の注文があります
  • 顧客エンティティには、ほとんどの場合入力されていない 15 ~ 20 のオプション属性が含まれています
  • 1日あたり約100件の新規感染者
  • データはバックグラウンドで他の複数のソースと同期されます

要件 (優先度の高いものから低いものへ):

  1. リンクされた顧客名によるケースなど、関連エンティティによる検索/並べ替えを実装する機能 (JOIN をサポート)
  2. データのスキーマを柔軟に変更でき、多数の属性に対して NULL を格納しない
  3. パフォーマンス
  4. 変更の監視をサポートし、データベースへの変更のみを保存できる Python 用 ORM

私たちが試したこと:

  • MongoDB はパラグラフ 1 を満たしていません。
  • 1 つのテーブルにすべての属性を持つ PostgreSQL は、パラグラフ 2 を満たしません。
  • 属性または EAV ごとに個別のテーブルを持つ PostgreSQL は、パラグラフ 3 (多くの遅い結合) を満たしていませんが、他のソリューションよりも優れているようです。

私たちのニーズを満たすデータベースまたはシステムの設計を提案できますか?

4

2 に答える 2

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"]]

The query engine looks in the database, and tries to satisfy the where clause by unifying all occurrences of a given variable. In this case, only ?c appears twice (the case has a linked customer c whose name is Barry), but queries can obviously get a lot more complex. The $ here represents the database.

于 2013-08-12T11:35:33.857 に答える