114

非リレーショナル「nosql」データベースで使用した設計戦略、つまり、従来のリレーショナル設計やSQLを使用しない(ほとんど新しい)クラスのデータストア(Hypertable、CouchDB、 SimpleDB、Google App Engineデータストア、Voldemort、Cassandra、SQL Data Servicesなど)。これらは「キー/値ストア」とも呼ばれ、基本的には巨大な分散型永続ハッシュテーブルのように機能します。

具体的には、これらの新しいデータベースとの概念的なデータ設計の違いについて学びたいと思います。何が簡単で、何が難しく、何がまったくできないのでしょうか。

  • 非リレーショナルの世界ではるかにうまく機能する代替デザインを思いついたことがありますか?

  • 不可能と思われるものに頭をぶつけたことはありますか?

  • たとえば、一方から他方に変換するために、ギャップをデザインパターンで埋めましたか?

  • 現在、明示的なデータモデル(UMLなど)をまったく実行していませんか、それとも半構造化/ドキュメント指向のデータブロブを完全に支持していますか?

  • リレーショナル整合性、任意に複雑なトランザクションサポート、トリガーなど、RDBMSが提供する主要な追加サービスのいずれかを見逃していませんか?

私はSQLリレーショナルDBのバックグラウンドを持っているので、正規化は私の血の中にあります。とは言うものの、私は単純さとスケーリングのために非リレーショナルデータベースの利点を享受しており、私の直感は、設計機能のより豊富な重複が必要であると私に教えてくれます。あなたは何をした?

参考までに、ここで同様のトピックに関するStackOverflowの議論がありました:

4

5 に答える 5

79

私は非リレーショナル DB を使い始めたばかりで、まだ頭を抱えて最善のモデルを見つけようとしています。そして、私は CouchDB についてしか話せません。

それでも、いくつかの暫定的な結論があります。

非リレーショナルの世界でよりうまく機能する別の設計を思いついたことがありますか?

設計の焦点が変わります: ドキュメント モデル (DB テーブルに対応) の設計はほとんど無関係になり、すべてはビュー (クエリに対応) の設計にかかっています。

ドキュメント DB は複雑さを入れ替えます。SQL には柔軟性のないデータと柔軟なクエリがあり、ドキュメント DB はその逆です。

CouchDB モデルは、"JSON ドキュメント" (基本的にネストされたハッシュ テーブル) のコレクションです。各ドキュメントには一意の ID があり、ID で簡単に取得できます。その他のクエリについては、map/reduce 関数の名前付きセットである「ビュー」を記述します。ビューは結果セットをキーと値のペアのリストとして返します。

秘訣は、SQL データベースにクエリを実行するという意味でデータベースにクエリを実行しないことです。ビュー関数を実行した結果はインデックスに格納され、インデックスのみをクエリできます。(「すべてを取得する」、「キーを取得する」、または「キー範囲を取得する」として。)

SQL の世界で最も近い類推は、ストアド プロシージャを使用してのみ DB をクエリできる場合です。サポートするクエリはすべて事前定義する必要があります。

ドキュメントのデザインは非常に柔軟です。私が見つけた制約は 2 つだけです。

  • 結合に対応するものがないため、関連するデータを同じドキュメントにまとめます。
  • ドキュメントが更新されるたびにインデックスの再作成がトリガーされるため、頻繁に更新されるほどドキュメントを大きくしないでください (その年のすべての会社の売上を同じドキュメントに入れるなど)。

しかし、すべてはビューの設計にかかっています。

私が見つけた代替設計は、ストレージ レベルではなくシステム レベルで、どの SQL データベースよりも CouchDB の方が桁違いにうまく機能します。いくつかのデータがあり、それらを Web ページに提供したい場合、システム全体の複雑さは少なくとも 50% 軽減されます。

  • DB テーブルの設計なし(軽微な問題)
  • ODBC/JDBC 中間レイヤーなし、すべてのクエリとトランザクションは http 経由(中程度の問題)
  • JSON からの単純な DB からオブジェクトへのマッピング。これは、SQL での同じものと比較してほとんど自明です (重要!)
  • アプリケーション サーバー全体をスキップできる可能性があります。ドキュメントが AJAX を使用してブラウザーによって直接取得されるように設計し、HTML として表示される前に JavaScript の洗練を少し追加できるからです。(巨大!!)

通常の Web アプリケーションの場合、ドキュメント/JSON ベースの DB は大きな利点であり、柔軟性の低いクエリとデータ検証用の追加コードの欠点は、支払う代償が小さいように思えます。

不可能に思えることに頭をぶつけたことがありますか?

まだ。データベースにクエリを実行する手段としての Map/Reduce はなじみがなく、SQL を記述するよりも多くのことを考える必要があります。プリミティブの数はかなり少ないため、必要な結果を得るには、主にキーの指定方法を工夫する必要があります。

クエリが同時に 2 つ以上のドキュメントを参照できないという制限があります。結合やその他の種類の複数ドキュメントの関係はありませんが、これまでのところ克服できないものはありません。

制限の例として、カウントと合計は簡単ですが、平均は CouchDB ビュー/クエリでは計算できません。修正: 合計とカウントを別々に返し、クライアントで平均を計算します。

たとえば、あるパターンから別のパターンに変換するなど、設計パターンでギャップを埋めましたか?

それが実現可能かどうかはわかりません。これは、機能的なスタイルのプログラムをオブジェクト指向のスタイルに変換するような、完全な再設計です。一般に、ドキュメントの種類は SQL テーブルよりもはるかに少なく、各ドキュメントにはより多くのデータがあります。

これを考える 1 つの方法は、挿入と一般的なクエリの SQL を調べることです。たとえば、顧客が注文したときにどのテーブルと列が更新されるかなどです。そして、月次売上報告はどれですか? その情報はおそらく同じドキュメントに含まれているはずです。

つまり、クエリを簡素化するために、必要に応じて複製されたフィールドを持つ、顧客 ID と製品 ID を含む注文用の 1 つのドキュメントです。ドキュメント内のすべてのものを簡単にクエリできます。たとえば、Order と Customer の間で相互参照が必要な場合は、クライアントが実行する必要があります。したがって、地域別の売上に関するレポートが必要な場合は、地域コードを注文に入れる必要があります。

現在、明示的なデータ モデル (UML など) を行っていますか?

申し訳ありませんが、ドキュメント DB の前にあまり UML を行ったことはありません :)

ただし、どのフィールドがどのドキュメントに属し、どのような値が含まれているかを示す何らかのモデルが必要です。後で参照するためと、DB を使用するすべての人が規則を知っていることを確認するための両方です。たとえば、テキスト フィールドに日付を格納してもエラーが発生しなくなり、誰でも好きなフィールドを追加または削除できるため、検証コードと規則の両方が必要です。特に外部リソースを扱う場合。

RDBMS が提供する主要な追加サービスを見逃していませんか?

いいえ。しかし、私のバックグラウンドは Web アプリケーション開発者であり、必要な範囲でのみデータベースを扱います :)

私が働いていた会社は、複数のベンダーの SQL データベースで実行するように設計された製品 (Web アプリケーション) を作成しました。「追加サービス」は DB ごとに非常に異なるため、DB ごとに個別に実装する必要がありました。そのため、機能を RDBMS から移動する作業は簡単でした。これは全文検索にまで及びました。

ですから、私があきらめているものは、そもそも私が本当に持っていなかったものです. 明らかに、あなたの経験は異なるかもしれません。


警告: 私が現在取り組んでいるのは、財務データ、株価などの Web アプリケーションです。これはドキュメント DB に非常に適しています。私の観点からは、DB のすべての利点 (永続性とクエリ) を手間をかけずに得ることができます。

しかし、これらのデータは互いに独立しており、複雑なリレーショナル クエリはありません。ティッカーで最新の相場を取得し、ティッカーと日付範囲で相場を取得し、会社のメタ情報を取得します。これでほとんどすべてです。私が見たもう 1 つの例はブログ アプリケーションで、ブログは非常に複雑なデータベース スキーマによって特徴付けられることもありません。

私が言おうとしているのは、私が知っているドキュメント DB の成功したアプリケーションはすべて、そもそもあまり相互関係のないデータであったということです: ドキュメント (Google 検索のように)、ブログ投稿、ニュース記事、財務データなどです。 .

ドキュメント モデルよりも SQL に適切にマッピングされるデータセットがあると予想されるため、SQL は生き残ると思います。

しかし、単純な方法でデータを保存および取得したいだけの私たちにとっては (CouchDB のような) ドキュメント データベースは天の恵みです。

于 2010-05-13T07:59:44.070 に答える
55

非リレーショナル DBMS はデータ モデルに関して大きく異なるため、概念的なデータ設計も大きく異なることを考慮する必要があると思います。NOSQL Google グループのスレッドData Design in Non-Relational Databasesでは、さまざまなパラダイムが次のように分類されています。

  1. Bigtable のようなシステム (HBase、Hypertable など)
  2. Key-Value ストア (東京、Voldemort など)
  3. ドキュメント データベース (CouchDB、MongoDB など)
  4. グラフ データベース (AllegroGraph、Neo4j、Sesame など)

私は主にグラフ データベースに興味があり、このパラダイムを使用したデータ設計の優雅さが、 RDBMSの欠点にうんざりしていた私をそこに導いたのです。グラフ データベースを使用したデータ設計の例をこのwiki ページにいくつか掲載しました。また、基本的なIMDBの映画/俳優/役割データをモデル化する方法の例もあります。

Marko Rodriguezによるプレゼンテーション スライド (slideshare) Graph Databases and the Future of Large-Scale Knowledge Managementには、グラフ データベースを使用したデータ設計の非常に優れた紹介も含まれています。

graphdb の観点から特定の質問に答える:

代替設計: さまざまな種類のエンティティ間の関係を、何の心配もなく、接続できるエンティティを事前に定義する必要もなく追加できます。

ギャップを埋める: 「テーブル指向のグラフ」などは必要ないため、ドメイン自体に基づいて、ケースごとにこれを異なる方法で行う傾向があります。ただし、RDBMS から graphdb への自動変換に関する情報を次に示します。

明示的なデータ モデル: 私はこれらを常に (ホワイトボード スタイルで) 行っており、DB でもモデルをそのまま使用しています。

RDBMS の世界から逃れたい: レポートを簡単に作成する方法。更新:グラフ データベースからレポートを作成するのはそれほど難しくないかもしれません。Neo4J サンプル データベースのレポートの作成 を参照しください

于 2009-07-28T08:57:49.517 に答える
11

私は心の奥底でCouchDBでこれに答えていますが、他のDBにもほとんどが当てはまると思います。CouchDB の使用を検討しましたが、データ アクセスが事前に知られていないことと、スケーラビリティが問題ではないことから、最終的には使用しないことにしました。

もっと強く:

  • 概念レベルで再考する必要があるため、単に異なるため「より困難」です。事前にデータ アクセス パターンを知る必要があるため、自動変換は適用できません。少なくともアクセス パターンを追加する必要があります。
  • 一貫性はデータベースでは処理されませんが、アプリケーションで処理する必要があります。保証が少ないということは、より複雑なアプリケーションを犠牲にして、移行、フェイルオーバー、スケーラビリティが容易になることを意味します。アプリケーションは、競合や矛盾に対処する必要があります。
  • ドキュメント (またはキー/値) をまたがるリンクは、アプリケーション レベルでも処理する必要があります。
  • SQL タイプのデータベースには、はるかに成熟した IDE があります。多くのサポート ライブラリを利用できます (ただし、これらのライブラリを階層化すると、SQL で必要とされるよりもはるかに複雑になります)。

より簡単に:

  • データ アクセス パターンを知っていれば、より高速です。
  • アプリケーション プログラマーとしての約束がないため、データベースの移行/フェールオーバーがより簡単になります。結果整合性は得られますが。おそらく。ついに。しばらく。
  • 1 つのキー/値は、テーブルの 1 つの行よりもはるかに理解しやすいです。すべての (ツリー) リレーションは既に含まれており、完全なオブジェクトを認識できます。

モデリングはほぼ同じである必要がありますが、1 つのドキュメントに何を含めるかについて注意する必要があります。UML は、OO モデリングと DB モデリングの両方に使用することもできますが、これらはすでに 2 つの異なる獣です。

C#/Silverlight と適切に統合された優れたオープン OO データベースを見たいと思っていました。選択をさらに難しくするだけです。:)

于 2009-07-27T19:05:09.473 に答える
1

私が実際に目にするリレーショナルデータベースは、あなたの主張に反して、まったく正規化されていない傾向があります。尋ねられたとき、デザイナーはそれが主にパフォーマンスのためだと私に言います。RDBMは結合が得意ではないため、正規化の観点からはテーブルの幅が広すぎる傾向があります。オブジェクト指向データベースは、これではるかに優れている傾向があります。

RDBMで問題が発生するもう1つのポイントは、履歴/時間依存キーの処理です。

于 2010-08-24T19:01:16.433 に答える
1

フラット ファイルは、どのようなサイズのデータ​​ セットに対しても難解で実用的ではないと長い間考えられてきました。ただし、より多くのメモリを備えたより高速なコンピューターでは、ファイルをメモリにロードしてリアルタイムで並べ替えることができます。これは、少なくとも n が適度に小さく、ローカルのシングル ユーザー アプリケーションの場合に当てはまります。

たとえば、通常、10,000 レコードのファイルを読み取り、フィールドで並べ替えることができる応答時間は 0.5 秒未満です。

もちろん、フラット ファイルの代わりにデータベースを使用する理由はいくつかあります。リレーショナル オペレーション、データの整合性、マルチユーザー機能、リモート アクセス、大容量、標準化などです。場合によっては、より実用的なデータを使用できます。

于 2009-07-27T19:11:08.167 に答える