私の現在のプロジェクトは、本質的には工場のドキュメント管理システムの実行です。
とはいえ、多少のしわ(驚き、驚き)があります。しわの一部はプロジェクトにかなり固有のものですが、一般的な答え(私はとにかく見つけることができません)がなく、より広い問題領域に適用できる一般的な観察と質問がいくつかあると思います。ここにはたくさんあり、StackExchangeのQ&A形式に適しているかどうかはわかりませんが、a)回答可能な質問であり、b)コミュニティに利益をもたらすほど具体的ではないと思います。私の考慮事項のいくつかは私に固有のものですが、SQLとNoSQLの両方を決定することに直面している誰にとっても、この質問は役に立ちそうだと思います。
私たちが作成しているWebアプリには、本質的にリレーショナルなデータとドキュメント指向のデータが含まれています。ケーキも食べてみたいです。
TL; DR:以下の#5はにおいテストに合格すると思います。あなたは?このようなSQLとNOSQLを単一のアプリケーションに統合した経験がある人はいますか?このクラスの問題に対して考えられるすべてのアプローチを以下にリストしてみました。有望な代替案を見逃しましたか?
基本的に、これはリレーショナルデータ(ユーザー、グループなどの一般的なWebアプリのもの、およびリアルタイムで複雑なクエリをスライスおよびダイシングできるようにする必要があるドキュメントメタデータ)とドキュメントデータ(例:結合やクエリに関心のない何百ものフィールド-データの唯一の使用例は、データが入力された単一のドキュメントを表示することです。
私は自分の優先する方法で健全性チェック(私の投稿履歴を確認した場合、私はDBAではないという事実についてかなり明白です)を行い、他の人が解決するために出くわしたすべてのオプションを列挙したかったリレーショナルデータと非リレーショナルデータの両方に関連する、ほぼ同様の問題。
1。ドキュメントクラスごとに1つのテーブル
各ドキュメントクラスは、すべてのメタデータとデータの列を持つ独自のテーブルを取得します。
利点:
短所:
2。 EAVモデリング
フィールドテーブルがあります。エンティティ属性値モデリングはすでに十分に理解されています。完全を期すために含めました。 2013年に開始される新しいプロジェクトは、意図的にEAVアプローチを採用するとは思いません。
利点:
短所:
3。 PostgreSQL hstoreまたはjsonフィールドを使用する
これらのフィールドタイプのいずれかが、リレーショナルDBのコンテキスト内でスキーマレスデータを格納するためのトリックを実行します。私がこのソリューションにすぐにジャンプしない唯一の理由は、それが比較的新しい(バージョン8.4で導入されたためではない新しい)ことです。疑わしい。 Mongoはドキュメント間の参照を処理できますが、ニースの簡単に正規化されたすべてのデータをMongoに投げ込むのと同じように感じるのとまったく同じ理由で、間違っていると思います。
利点:
短所:
4。ドキュメント指向のフルボア
(MongoDBの意味で)すべてのものを文書化します。タイプDocument
の単一のコレクションを作成し、1日と呼びます。すべての周辺データ(ユーザーアカウント、グループなどのデータを含む)もmongoに取り込みます。このソリューションは明らかにEAVモデリングより優れていますが、同じ理由で#3が間違っているように感じます。どちらもハンマーをドライバーとして使用しているように感じます。
利点:
Document
のドキュメントを含むコレクションを1つ作成し、1日と呼びます。短所:
5。 PostgreSQLおよびMongoDB
リレーショナルデータはリレーショナルデータベースに入り、ドキュメントデータはドキュメント指向データベースに入ります。リレーショナルデータベースのdocuments
テーブルには、インデックスを作成したりスライスしたりするのに必要なすべてのデータと、フィールドの実際の値をクエリする必要があるときに使用するMongoDB ObjectIdが含まれていますドキュメント。ドキュメント自体の値にORMまたは組み込みの管理者を使用することはできませんが、アプリ全体が基本的にドキュメントの管理者インターフェイスであるため、それほど大きな損失ではありません。 ORMの特定の部分を許容できない程度にカスタマイズして、必要な方法で機能させる。
利点:
documents
テーブルは1つだけ必要です。短所:
いくつかの考え....
通常、相互に密接に関連する情報を異なるシステムに保存することは望ましくありません。同期が外れる可能性は非常に高く、1つの問題ではなく2つの問題が発生します。 Mongoでできることの1つは、Mongoを使用してデータをパイプラインで送受信することです。私の好みは、可能な限りすべてをPostgreSQLに保持することです。ただし、これを行うにはPostgreSQLプログラミングの専門知識が本当に必要であり、高度な機能を使用することに専念したくないショップのためではないことに注意します。あなたとは少し異なるオプションのセットが表示されます。私の好みは私がリストされているものではないので、あなたにそれをあげます。
おそらく、メタデータを共通データ、クラスに必要なデータ、およびドキュメントデータに分離できます。この点で、基本的な共通情報とクラスごとに1つのテーブルを含む一般的なカタログテーブルがあります。このテーブルには、hstore、json、またはxmlフィールドがあり、これらのフィールドには、大幅に制約する必要のあるデータを格納する列とともに残りのデータが格納されます。これにより、クラスごとにこれらのテーブルに入力する必要のあるものが減りますが、制約を自由に活用できます。 3つのオプションには異なる問題があり、個別に検討する価値があります。
hstoreは比較的制限されていますが、多くの人が使用しています。それほど新しいものではありませんが、キーと値のストアであり、jsonやxmlとは異なり、データ構造をネストすることはできません。
jsonは非常に新しく、現時点ではあまり機能しません。これはそれで多くのことを行うことができないという意味ではありませんが、箱から出して多くをするつもりはありません。その場合、おそらくplv8jsで、または古い環境を使い続けたい場合は、plperluまたはplpythonで、かなりの量のプログラミングを行うことが期待できます。 json
は、少なくとも現在の開発スナップショットではサポートされていますが、9.3ではより適切にサポートされているため、そのバージョンがリリースされると状況が改善されます。
xmlは、3つの中で最もサポートされており、ほとんどの機能と最も長いサポート履歴があります。次に、XMLです。
ただし、MongoとPostgreSQLを一緒に使用する場合は、PostgreSQLが2フェーズコミットをサポートしていることを意味します。つまり、書き込み操作を実行してからPREPARE TRANSACTION
を発行し、これが成功するとMongoでアトミックな書き込みを実行できます。それが成功した場合、PostgreSQLでCOMMIT
を実行できます。
Presto または Dremio などのクエリエンジンを設定して、MongoDBとPostgresにあるデータを1つのクエリで結合できます。どちらもこれらのデータベースごとにコネクタがあり(ドキュメント here および here を参照)、それぞれ、「SQL on any」と「join Any」を実行することを提案します。
Prestoをテストするには、Hadoop、Hive、Prestoを使用してAWS EMRに小さなクラスターをデプロイできます(コマンドラインを使用しない場合は色相を追加します)。これはボックスから機能します。必ず これらに従ってください)コネクタのセットアップ手順 。 Hiveは必ずしも必要ではありませんが、MongoとPostgresの結合の結果を使用してテーブルを作成できます(例は このページ を確認してください)。 市場での有料バージョン もあります。これは(おそらく)大幅に最適化されており、30日間の試用版があります。
私はDremioを使用していませんが、AWS、Azure、またはオンプレミスでals それをデプロイするいくつかの簡単な方法 があります。彼らは ウェブサイトのいくつかのオンラインコース を利用して、クラスを無料でフォローできる「仮想ラボ」にアクセスできます。