web-dev-qa-db-ja.com

非リレーショナルデータベースの設計

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

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

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

  • 不可能と思われるものに頭を打ちましたか?

  • 設計パターンでギャップを埋めましたか?一方から他方に翻訳するには?

  • 明示的なデータモデルを今でも(たとえばUMLで)しているのですか、それとも完全に半構造化/ドキュメント指向のデータBLOBを支持しているのですか?

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

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

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

113
Ian Varley

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

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

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

プレゼンテーションのスライド(slideshare) グラフデータベースと大規模ナレッジマネジメントの将来 by Marko Rodriguez には、グラフデータベースを使用したデータ設計の非常に素晴らしい紹介も含まれています。

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

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

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

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

RDBMSの世界のミス:レポートを作成する簡単な方法。更新:多分、グラフデータベースからレポートを作成するのは難しくない、 Neo4Jサンプルデータベースのレポートの作成 を参照してください。

55
nawroth

私は非リレーショナルDBで始めたばかりで、今でも頭を包んで最高のモデルが何であるかを考えています。そして、私はCouchDBについてのみ話すことができます。

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

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

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

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

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

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

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

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

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

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

私が見つけた代替設計では、CouchDBの作業順序は、SQLデータベースよりもストレージレベルではなくシステムレベルで優れていることがわかりました。データがあり、それらをWebページに提供したい場合、システム全体の複雑さが少なくとも50%削減されます。

  • dBテーブルの設計なし(マイナーな問題)
  • oDBC/JDBC中間層なし、http経由のすべてのクエリとトランザクション(中程度の問題)
  • jSONからの単純なDBからオブジェクトへのマッピング。これは、SQLでの同じものと比較してほとんど簡単です(important!)
  • AJAXを使用してブラウザが直接取得するようにドキュメントを設計し、HTMLとして表示される前にJavaScriptを少し磨くことができるため、アプリケーションサーバー全体をスキップできます。 (巨大!!)

通常のWebアプリの場合、ドキュメント/ JSONベースのDBは大きな勝利であり、クエリの柔軟性が低く、データ検証用の余分なコードがあるという欠点は、わずかな代償です。

不可能と思われるものに頭を打ちましたか?

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

クエリは2つ以上のドキュメントを同時に見ることができないという制限があります。結合や他の種類のマルチドキュメントリレーションシップはありませんが、これまでに克服できないものはありません。

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

設計パターンでギャップを埋めましたか?一方から他方に翻訳するには?

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

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

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

今でも明示的なデータモデルを作成していますか(UMLなど)?

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

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

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

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

私が働いていた会社は、複数のベンダーのSQLデータベース間で実行されるように設計された製品(webapp)を作成しました。そのため、RDBMSから機能を移動する作業が少なくなりました。これは全文検索にまで拡張されました。

ですから、あきらめようとすることは、そもそも本当にそうではなかったものです。明らかに、あなたの経験は異なるかもしれません。


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

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

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

ドキュメントモデルよりもSQLの方が適切にマッピングされるデータセットがあることを期待しているので、SQLは存続すると思います。

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

79
j-g-faustus

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

もっと強く:

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

より簡単に:

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

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

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

11

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

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

1

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

たとえば、通常、10,000件のレコードのファイルを読み取り、フィールド上で0.5秒未満の応答時間でソートできます。

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

1
xpda