非リレーショナルデータベースの設計[終了]


114

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

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

  • 非リレーショナルの世界でよりうまく機能する代替設計を思いついたか。

  • 不可能と思われるものに頭をぶつけましたか?

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

  • 明示的なデータモデルを(UMLでなど)実行したり、半構造化/ドキュメント指向のデータブロブを全面的に採用したりしていますか?

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

私はSQLリレーショナルDBの出身なので、正規化は私の血の中にあります。とは言っても、単純化とスケーリングのための非リレーショナルデータベースの利点が得られ、設計機能にはより豊富なオーバーラップが必要であることが私の内臓からわかります。あなたは何をした?

参考までに、ここで同様のトピックに関するStackOverflowディスカッションが行われました。


2
キー/値データベースは古いものです。
クリストファー

1
非常に興味のある方のために、NoSQLのgoogleグループで行われている長い形式のディスカッションがあります。ここでは、groups.google.com
Ian Varley、

4
ちなみに、私はこのトピックについて長い形式のレポートを書きました。ここ:google.com/url?sa =D&q= http : //ianvarley.com/UT/MR/… 有益な情報を提供してくださった皆さんに感謝します!
Ian Varley、2010年

回答:


55

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

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

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

プレゼンテーションスライド(slideshare)グラフデータベースとMarko Rodriguezによる大規模な知識管理の未来、グラフデータベースを使用したデータデザインの紹介も含まれています。

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

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

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

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

RDBMSの世界からの欠落:レポートを作成する簡単な方法。アップデート:多分それはないことを、ハード参照、グラフデータベースからレポートを作成するためのNeo4jサンプルデータベースのためのレポートを作成します


79

非リレーショナルDBから始めたばかりで、まだ頭を抱えて、どのモデルが最適かを考えています。そして、私はCouchDBについてのみ話すことができます。

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

非リレーショナルの世界でよりうまく機能する代替設計を思いついたか。

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

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

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

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

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

ドキュメントのデザインは非常に柔軟です。私はたった2つの制約を見つけました:

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

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

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つのドキュメントです。ドキュメント内のすべてのものは簡単に照会できます。たとえば、注文と顧客の間の相互参照が必要なものはすべてクライアントが実行する必要があります。したがって、地域ごとの売上に関するレポートが必要な場合は、地域コードを注文に含める必要があります。

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

申し訳ありませんが、ドキュメントDBの前にUMLをあまり実行していません:)

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

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

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

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

だから、あきらめているものは何でもそもそも私が本当に持っていなかったものです。明らかに、あなたの経験は異なる場合があります。


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

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

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

ドキュメントモデルよりもSQLに適切にマップするデータセットがあると思います。そのため、SQLは存続すると思います。

しかし、データを格納および取得する簡単な方法を必要とする私たち(そして私たちの多くがいるのではないかと思う)にとって、ドキュメントデータベース(CouchDBなど)は天の恵みです。


9
非常に便利。特に「SQLには柔軟性のないデータと柔軟なクエリがあり、ドキュメントDBはその逆です」と、結合がありません。
j_random_hacker

2
+1、これは非常に洞察に満ちていました。
2010

2
だから本当です、できれば複数回投票します。
Octavian A. Damiean 2012

これは2014年にも非常に役立ちました。2010年以降に学んだことを追加したり、他の場所にある情報にリンクしたりできると便利です。
マギー14

11

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

もっと強く:

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

より簡単に:

  • データアクセスパターンがわかっている場合は、より高速です。
  • アプリケーションプログラマとしての約束がないので、データベースの移行/フェイルオーバーは簡単です。結果的に一貫性は得られますが。恐らく。最後に。しばらく。
  • 1つのキー/値は、テーブルの1つの行よりもはるかに簡単に理解できます。すべての(ツリー)関係はすでに存在しており、完全なオブジェクトを認識できます。

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

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


1

フラットファイルは、古くからあり、あらゆるサイズのデータ​​セットに対して実用的ではないと考えられてきました。ただし、より多くのメモリを搭載したより高速なコンピュータでは、ファイルをメモリにロードしてリアルタイムで並べ替えることができます。これは、少なくともかなり小さいnおよびローカルのシングルユーザーアプリケーションでは可能です。

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

もちろん、フラットファイルの代わりにデータベースを使用する理由があります。リレーショナル操作、データの整合性、マルチユーザー機能、リモートアクセス、大容量、標準化などですが、コンピューターの速度とメモリ容量の増加により、メモリ内の操作が行われていますいくつかのケースでより実用的なデータの。


1

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

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


3
ステファン-実際のシステムでは正規化部門に欠けていることが多いのはあなたです。しかし、RDBMesは「参加が得意ではない」と言うのは正確ではありません。ほとんどの商用製品(Oracle、MS SQL Serverなど)には非常に高度なクエリオプティマイザーがあり、アプリケーションコードで同じ操作を実行するよりもはるかに高速に、さまざまな異なる物理結合アルゴリズムを実行できます。(MySQLは私が理解していることから、これに対する例外です)。私の経験では、時期尚早な非正規化は、他の時期尚早な最適化と同様に、多くの場合、開発者が貧弱であることを示しています。
Ian Varley 2010

2
この考えを続ける:不十分な結合は、不十分なインデックス付けと統計の結果です。オプティマイザが何も操作できない場合、またはオプティマイザが持っているものに関する情報が最新でない場合、不適切な選択になります。多くの人はこれを「貧弱な参加」と間違えています。最新のRDBMシステムにはセルフチューニング機能があり、インデックス作成と統計を設定するときに頭を使う必要性を覆い隠します。また、人々は論理スキーマ(第5正規形)と物理スキーマ(頻繁に非正規化されて第3正規形)を混同します。あなたはDBという理由だけで見るには、「ワイド」で、それが不十分論理的に設計されたという意味ではありません。
Godeke
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.