web-dev-qa-db-ja.com

ドキュメントベースのデータベースとリレーショナルデータベースの長所/短所

ドキュメントベースのデータベース(この場合はCouchDB)でいくつかの要件を達成できるかどうかを確認しようとしてきました。 2つの一般的な要件:

  • 一意のインデックスを持ついくつかのフィールドを持つエンティティのCRUD
  • eBayのようなeコマースWebアプリ( こちらの説明が良い )。

そして、これらの要件に対処するには、ドキュメントベースのデータベースは最良の選択ではないと考え始めています。さらに、ドキュメントベースのデータベースの使用を想像することはできません(おそらく、想像力があまりにも限られています)。

これらの要件にドキュメント指向のデータベースを使用しようとすると、Elmに梨を求めている場合、私に説明できますか?

69
user2427

ドキュメント指向の方法でアプリケーションにどのようにアプローチするかを考える必要があります。 RDBMSで問題をモデル化する方法を単純に複製しようとすると、失敗します。また、さまざまなトレードオフがあります。 ([ed:これがどのように引数に結びついているのかわかりませんが、:] CouchDBの設計は、いつでも失敗する可能性のある多くのノードのアクティブクラスターがあることを前提としていることに注意してください。それの下に?)

それについて考える1つの方法は、あなたがコンピュータを持っていなかったと想像することです、ただ紙の文書。大量の紙を使って効率的なビジネスプロセスをどのように作成しますか?ボトルネックをどのように回避できますか?何かがうまくいかない場合はどうしますか?

考えるべきもう1つの角度は、最終的な一貫性です。最終的に一貫性のある状態になりますが、一定期間一貫性がなくなる場合があります。これは、RDBMSの世界では嫌悪感ですが、現実の世界では非常に一般的です。正規取引の例は、銀行口座からの送金です。現実の世界では、これは実際にどのように行われますか?単一のアトミックトランザクションや、相互にクレジットおよびデビット通知を発行するさまざまな銀行を通じて?小切手を書くとどうなりますか?

あなたの例を見てみましょう:

  • 一意のインデックスが設定されたいくつかのフィールドを持つエンティティのCRUD。

CouchDBの用語でこれを正しく理解している場合、名前付きの値がすべてのドキュメントで一意であることが保証されているドキュメントのコレクションが必要ですか?ドキュメントは異なるレプリカで作成される可能性があるため、このケースは通常サポートできません。

したがって、現実の問題を見て、それをモデル化できるかどうかを確認する必要があります。本当にユニークにする必要がありますか?アプリケーションは同じ値を持つ複数のドキュメントを処理できますか?一意の識別子を割り当てる必要がありますか?それを決定論的に行うことはできますか?これが必要な一般的なシナリオは、一意の連続識別子が必要な場合です。これは、複製された環境で解決するのが難しいです。実際、一意のIDが作成時間に関して厳密に連続している必要がある場合、不可能ですifすぐにIDが必要です。これらの制約の少なくとも1つを緩和する必要があります。

  • ebayのようなeコマースWebアプリ

その投稿に対して最後に行ったコメントが「非常に役立つ!ありがとう」と言ったので、ここに何を追加するのかわかりません。そこに概説されているアプローチから、まだ問題を引き起こしているものが欠けていましたか? MrKurtの答えはかなり充実していると思い、競合を減らすための少しの拡張を追加しました。

34
Kerr

データを正規化する必要はありますか?

  • はい:リレーショナルを使用します。
  • いいえ:文書を使用します。
14
dacracot

私は同じ船に乗っており、現時点ではcouchdbを愛しています。機能的なスタイル全体が素晴らしいと思います。しかし、正確にいつアプリケーションのアーネストで使用し始めますか。つまり、私たちは皆、非常に迅速にアプリケーションの開発を開始することができます。通常の形式が邪魔になり、スキーマを使用しないという厄介なハングアップで、手間がかかりません。しかし、「私たちは巨人の肩の上に立っている」というフレーズを作り出します。 RDBMSを使用し、スキーマを正規化して使用する正当な理由があります。私の古いOracleの頭は、フォームのないデータについて考えています。

Couchdbでの私のすごい要因は、レプリケーションとバージョン管理システムが連携して動作することです。

私は先月、couchdbのストレージメカニズムを理解しようとして頭を悩ませてきました。明らかにBツリーを使用していますが、通常の形式に基づいたデータは保存していません。これは本当にスマートであり、データのビットが複製されていることを認識しているので、このBツリーエントリへのポインタを作成するだけですか?

これまでのところ、xmlドキュメント、設定ファイル、base64文字列にストリームされるリソースファイルについて考えています。

しかし、構造データにはcouchdbを使用します。私にはわかりませんが、これについてはどんな助けも大歓迎です。

RDFデータまたは自由形式のテキストでさえも保存するのに役立つかもしれません。

7
WeNeedAnswers

可能性としては、IDによって取得できるアイテムの定義を保存するメインのリレーショナルデータベースと、それらのアイテムの説明や仕様のドキュメントデータベースがあります。たとえば、次のフィールドを持つProductsテーブルを持つリレーショナルデータベースを作成できます。

  • 製品番号
  • 説明
  • 単価
  • ロットサイズ
  • 仕様書

そして、その仕様フィールドには、実際には製品の技術仕様を含むドキュメントへの参照が含まれます。このようにして、あなたは両方の長所を持っています。

4
pyon

ドキュメントベースのDBは、ドキュメントの保存に最適です。 Lotus Notesは一般的な実装であり、Notesメールはその一例です。あなたが説明しているもの、eコマース、CRUDなどについては、(ドキュメントとは対照的に)インデックス付けされたデータ項目/要素の保存と検索のために、オプションDBがより良く設計されています。

3
Jim Anderson

CRUDに関して:RESTパラダイムはCRUDに直接マップされます(またはその逆)。したがって、リソース(URIで識別可能)および基本的な操作セット(つまり、CRUD)、RESTベースのシステムに非常に近い可能性があります。RESTベースのシステムでは、ほとんどのドキュメント指向システムがすぐに使用できます。

0
KoW