リレーショナルデータベースを使用しない正当な理由は?


139

代替のデータストレージツールを指摘して、古き良きリレーショナルデータベースの代わりにそれらを使用する十分な理由を教えていただけませんか?私の意見では、ほとんどのアプリケーションがSQLの全機能を使用することはめったにありません。SQLフリーのアプリケーションを構築する方法を見るのは興味深いでしょう。

回答:


148

ファイルシステム内のプレーンテキストファイル

  • 作成と編集が非常に簡単
  • ユーザーが簡単なツール(テキストエディター、grepなど)で簡単に操作できる
  • バイナリー文書の効率的な保管

ディスク上のXMLまたはJSONファイル

  • 上記と同じですが、構造を検証する機能が少し追加されています。

スプレッドシート/ CSVファイル

  • ビジネスユーザーが理解する非常に簡単なモデル

Subversion(または同様のディスクベースのバージョン管理システム)

  • データのバージョン管理に対する非常に優れたサポート

Berkeley DB(基本的に、ディスクベースのハッシュテーブル)

  • 概念的には非常にシンプル(型付けされていないキー/値のみ)
  • かなり速いです
  • 管理オーバーヘッドなし
  • 信じる取引をサポート

AmazonのシンプルDB

  • Berkeley DBによく似ていますが、ホストされています

GoogleのApp Engineデータストア

  • ホストされ、拡張性が高い
  • ドキュメントごとのKey-Valueストレージ(つまり、柔軟なデータモデル)

CouchDB

  • ドキュメントのフォーカス
  • 半構造化/ドキュメントベースのデータのシンプルなストレージ

母国語コレクション(メモリに保存されているか、ディスクにシリアル化されている)

  • 非常に緊密な言語統合

カスタム(手書き)ストレージエンジン

  • 必要なユースケースで潜在的に非常に高いパフォーマンス

私はそれらについて多くを知っていると主張することはできませんが、オブジェクトデータベースシステムを調べることもできます


10
それぞれの選択肢の欠点も説明していただければすばらしいと思いますが、それ以外の場合はどのように選ぶべきですか?よろしく
お願いし

4
また、数百万行のDBへの書き込みには1日かかり、100万行のログをファイルに追加すると、ほんの数分しかかかりません。なぜ人々がログデータをデータベースに入れようと主張するのか、私には理解できません。
アーロンディグラ2008

33
アーロン:私には1つの理由があります:ログの場所からメッセージを選択します(日付BETWEEN 2009-01-01 AND 2009-03-01)AND type = 'error' AND system = 'windows' :)どのようにテキストファイルから読み込みますか?
トマーシュFejfar

1
私は可能な限りテキストファイルを強く支持しています。あなたは、常にそれらを使用することはできませんが、あなたは、彼らがしていることができたときにそんなに簡単に問題を診断する。
ローレンPechtel

berkeley dbには間違いなくトランザクションがあります。テキストファイルとxml / jsonファイルはサポートしていません。そのため、注意しないとマルチスレッドアプリがそれらを踏む可能性があります。CSVファイルはパラメーターのコレクションに最適です。ビジネスユーザーは追加のツールなしでパラメーターを確認して編集できるためです。テキストファイルは、ロギングなどの1回限りの書き込み/ほとんど読み取りが不要なアプリケーションに最適です。あなたが達成しようとしているかを把握する必要があるアプローチを選択する
O.ジョーンズ

26

Matt Sheppardの答えは素晴らしい(mod up)ですが、スピンドルについて考えるとき、これらの要素を考慮に入れます。

  1. 構造:明らかにバラバラになりますか、それともトレードオフを行っていますか?
  2. 使用法:データはどのように分析/取得/グロックされますか?
  3. 寿命:データはどれくらいの期間有効ですか?
  4. サイズ:データはどれくらいありますか?

RDBMSに対するCSVファイルの特別な利点の1つは、簡単に圧縮して、他のほとんどのマシンに移動できることです。私たちは大規模なデータ転送を行い、すべてが1つの大きなCSVファイルを使用するだけで十分簡単で、rsyncなどのツールを使用して簡単にスクリプトを作成できます。大きなCSVファイルの繰り返しを減らすには、YAMLのようなものを使用できます。重要な関係要件がない限り、JSONやXMLなどを保存するかどうかはわかりません。

言及されていない代替案については、MapReduceのオープンソース実装であるHadoopを軽視しないでください。これは、分析する必要がある緩やかに構造化されたデータのTONがあり、データ処理を処理するために10台のマシンを追加するだけのシナリオにしたい場合にうまく機能します。

たとえば、私は約20台のマシンにわたって記録されたさまざまな機能の本質的にすべてのタイミング数であるパフォーマンスの分析を試み始めました。RDBMSにすべてを貼り付けようとしたところ、データを集約した後は、データを再度クエリする必要がないことに気付きました。そして、それは私にとってその集約されたフォーマットでのみ有用です。そのため、ログファイルを保持し、圧縮して、集計データをDBに残しています。

「大きな」サイズで考えることに慣れていることに注意してください


5
CSVファイルの1つの危険は、エスケープを正しく行う必要があることです。一見単純そうに見え、いくつかの微妙な点があるため、仕様に実際には従わないCSVリーダーまたはCSVライターを実装するのは簡単です。en.wikipedia.org
Jared Updike

10

ファイルシステムは、バイナリデータを保存するのに非常に便利です。これは、リレーショナルデータベースでは驚くほどうまく機能しません。


6

Prevaylerを試してください: http: //www.prevayler.org/wiki/ PrevaylerはRDBMSに代わるものです。サイトではより多くの情報を持っています。


6

ACIDが必要ない場合は、RDBMSのオーバーヘッドはおそらく必要ありません。したがって、最初にそれが必要かどうかを判断します。ここで提供されているRDBMS以外の回答のほとんどは、ACIDを提供していません


1
ACIDが不要な理由/例を教えてください。
Ivan Voroshilin 2013年

1
@vibneiro、データベースにシーケンシャル操作のみを行う単一のユーザーしかいない場合、または停電の場合にデータベースの不整合のリスクが許容できる場合、またはデータベーストランザクションの概念が適用されない場合、または制約の必要がない場合、カスケード、トリガーなどの場合、非ACID非RDBMSプロバイダー(たとえば、RDBMSのようなAPIを含むテキストファイル)で十分です。たとえば、アプリケーションは、ACIDが完全に無関係で「log.txt」で十分である履歴診断メッセージのデータベースを保持する場合があります。
bzlm 2013年

非常にまれなケースではACIDが不要であることがわかります。では、なぜNoSQLデータベースはそれほど人気が​​あるのでしょうか。それらの大部分は、完全なACIDityをサポートしていません。
Ivan Voroshilin 2013年

@vibneiro、NoSQLのはで、通常は、より直感的に、通常より柔軟簡単に、より軽量で、より多くの組み込み可能な、より多くの自己ホスト可能であり、いくつかの ACID。リレーショナルデータがない場合、RDBMSはおそらく必要ではありません。
bzlm 2013年

6

カスタム(手書き)ストレージエンジン/必要なユースケースで潜在的に非常に高いパフォーマンス

http://www.hdfgroup.org/

膨大なデータセットがある場合は、独自のデータセットをローリングする代わりに、階層データフォーマットであるHDFを使用することができます。

http://en.wikipedia.org/wiki/Hierarchical_Data_Format

HDFは、多次元配列、ラスターイメージ、テーブルなど、いくつかの異なるデータモデルをサポートしています。

また、ファイルシステムのように階層的ですが、データは1つの魔法のバイナリファイルに格納されます。

HDF5は、非常に大規模で複雑なデータコレクションの管理を可能にするスイートです。

ペタバイト級のNASA / JPLリモートセンシングデータを考えてみてください。


4

G'day、

モデル化しているデータをリレーショナルデータベースで簡単に表現できない場合が1つ考えられます。

そのような例の1つは、携帯電話事業者が携帯電話ネットワークの基地局を監視および制御するために使用するデータベースです。

私はこれらのケースのほとんどすべて、 、オブジェクトの階層を可能にする市販の製品または自己ロールシステムのいずれか OO DBを使用しています。

私は無名のままでいる大企業の3G監視アプリケーションに取り組んでいますが、そのロゴは赤ワインの染み(-:であり、そのようなOO DBを使用して、通信網。

このようなDBの問い合わせは、通常、SQLを完全に使用しない独自の手法を使用して行われます。

HTH。

乾杯、

ロブ


4
基地局のデータがリレーショナルモデルに適さないのはなぜですか?
kaybenleroll 2008

3

オブジェクトデータベースはリレーショナルデータベースではありません。データベースにいくつかのオブジェクトを詰め込みたいだけの場合は、とても便利です。また、データベースにすでに存在するオブジェクトのバージョン管理と変更クラスもサポートします。最初に思い浮かぶのはdb4oです。


3

場合によっては(金融市場データやプロセス制御など)、RDBMSではなくリアルタイムデータベースを使用する必要がある場合があります。参照してください。ウィキリンク


3

OODBMSが組み込まれた、数年前に作成されたJADEというRADツールがありました。DBエンジンの初期の化身もDigitalk Smalltalkをサポートしていました。RDBMS以外のパラダイムを使用してアプリケーションのビルドをサンプリングする場合は、これが出発点になる場合があります。

他のOODBMS製品にはObjectivityGemStoneが含まれます(Smalltalkバージョンを実行するにはVisualWorks Smalltalkを入手する必要がありますが、Javaバージョンもあります)。このスペースにはいくつかのオープンソースの研究プロジェクトもありました-EXODUSとその子孫が思い浮かぶはずです。

悲しいことに、おそらくSQLベースのRDMBSシステムと比較して、はっきりと見える標準がなく、アドホッククエリ機能が比較的貧弱であるため、この概念は死に絶えたように見えました。

OODBMSは、相互接続されたノードのグラフとして最もよく表されるコアデータ構造を持つアプリケーションに最適です。私は、典型的なOODBMSアプリケーションはマルチユーザーダンジョン(MUD)であり、部屋にはプレイヤーのアバターやその他のオブジェクトが含まれると言っていました。


2
クライアントSmalltalkがGemStone / S(デスクトップアプリ用)を使用する必要があるが、WebフレームワークAida(aidaweb.si)、およびSeaside(seaside.st)GemStone / Sをアプリケーションとして直接使用できることは、以前は真実でしたサーバ。GLASS(seaside.gemstone.com)の情報を参照してください
デールヘン

もう1つの理由は、データ品質を重視する場合です。GemstoneのようなOODBでは、複雑な有効性ルールを適用する方がはるかに簡単です。
Stephan Eggermont

OODBMSのアドホッククエリ機能は、SQLベースのRDBMS-esのアドホッククエリ機能よりもはるかに優れています
Stephan Eggermont 2011

1

ファイルシステムに保存されているファイルを使用するだけで、大きな成果が得られます。RDBMSはBlobの処理に優れていますが、これは特にクエリが単純な場合(個々のアイテムを列挙して選択する場合)、画像データなどを処理する自然な方法です。

RDBMSにうまく適合しない他の事柄は、階層データ構造であり、地理空間データと3Dモデルはどちらも扱いが難しいと思います。

Amazon S3のようなサービスは、SQLをサポートしないシンプルなストレージモデル(キー->値)を提供します。スケーラビリティが鍵となります。

特に、ユーザーが使い慣れた環境でデータを操作し、それを行うための完全なアプリケーションを構築する必要がある場合は、Excelファイルも役立ちます。


1

データを格納する方法は多数あります。「リレーショナルデータベース」でさえ、ローカルファイルを単一のユーザーベースのリレーショナルデータベースであるかのように操作するコードの単純なライブラリから、複数のユーザーを処理できるファイルベースのシステムよりも、深刻な「サーバー」ベースのシステムを豊富に選択できます。

私たちはXMLファイルを頻繁に使用します。適切に構造化されたデータ、同じようにクエリを実行するための優れたツール、必要に応じて編集を行う機能、人間が読める形式のものを使用するため、dbエンジンの動作(またはdbエンジン)。これは、本質的に読み取り専用のもの(この場合、他の場所のデータベースから生成されないことが多い)や、必要に応じてデータをロードして保存できるシングルユーザーシステムでもうまく機能しますが、機会を創出していますマルチユーザー編集が必要な場合の問題-少なくとも1つのファイルについて。

私たちにとってはそれだけです-SQLを実行するものを使用します(MSは.DLLから実行される一連のツールを提供して、エンタープライズサーバーに至るまでシングルユーザーを実行し、それらはすべて同じSQLを話します(下限に制限があります))または、(私たちにとって)冗長性がめったに問題にならないため、XMLをフォーマットとして使用します。

現在、アプリでバイナリデータを操作する必要はないので、問題は発生しません。

マーフ


1

アプリケーションデータが本質的にキー/値指向で階層的である場合は、従来のSQLデータベースの代わりにLDAPサーバーの使用を検討することもできます。


1

多くの場合、BTreeファイルはリレーショナルデータベースよりもはるかに高速です。SQLiteには、パブリックドメインにあるBTreeライブラリが含まれています(本当は「パブリックドメイン」のように、用語を大まかに使用していません)。

率直に言って、もし私がマルチユーザーシステムが欲しかったなら、まともなサーバーリレーショナルデータベースを使わないようにたくさんの説得が必要になるでしょう。


BTreeは、通常のインデックスの基本的な実装です。Oracleは、索引として実装された単なる表である索引構成表をサポートしています。Bツリーは読み取りが速く、書き込みが遅く、使用します。参照:< oracle.com/technology/products/oracle9i/datasheets/iots/… >
borjab

1

「10ワード以内」などの近接演算子を使用して照会できるフルテキストデータベース

リレーショナルデータベースは、多くの目的に理想的なビジネスツールです。「フルパワーを使用する」ことができる天才によって設計および最適化されていない場合でも、理解と設計が十分に簡単で、十分に速く、適切です。

ただし、一部のビジネス目的では、全文索引付けが必要です。これは、リレーショナルエンジンでは提供されないか、後付けとして追加されません。特に、法務および医療分野には、構造化されていないテキストが大量に保存されており、それらを通過できます。


1

また、*埋め込みシナリオ-通常、本格的なRDBMSよりも小さいものを使用する必要があります。Db4oは、そのような場合に簡単に使用できるODBです。*迅速または概念実証の開発-ビジネスに集中し、永続性レイヤーを心配しない場合



1

KISS:小さくシンプルに


1
それは礼儀正しいバージョンです...私はより頻繁に「それをシンプルに、愚かにしてください」と聞いたことがあります...または、一口、おそらくそれは人々が私に言うだけです!:-(
GreenMatt 2010

1

私はRDBMSを提供します:)セットアップ/管理に問題がないと思わない場合は、SQLiteを使用してください。SQLを完全にサポートする組み込みRDBMS。また、任意のタイプのデータを任意の列に格納することもできます。

たとえばログファイルの例に対する主な利点:巨大なファイルがある場合、どのように検索するのですか?SQLエンジンを使用すると、インデックスを作成して操作を劇的に高速化できます。

全文検索について:SQLiteには全文検索用のモジュールもあります。

あなたのデータへの素敵な標準インターフェースを楽しんでください:)



0

SQLiteの種類のデータストレージの代替としてLuaを強くお勧めします。

なぜなら:

  • 言語は、最初からデータ記述言語として設計されました
  • 構文は人間が読める形式です(XMLはそうではありません
  • Luaチャンクをバイナリにコンパイルして、パフォーマンスを向上させることができます

これは、受け入れられた回答の「母国語コレクション」オプションです。アプリケーションレベルとしてC / C ++を使用している場合は、構成/データの読み取りや書き込みのために、Luaエンジン(100kBのバイナリ)を投入するのが妥当です。


Luaはプログラミング言語です。この提案を一般化して、プログラミング言語の永続化/シリアライゼーション機能を提案することができます(たとえば、Pythonのpickle / shelve、またはPerlなどのJSON / YAMLなど)。これは、同時アクセスやACIDの保証にはまったく対応していません。
ジム・デニス

あなたが正しい。私のエントリに欠けていたのは、そのような使用法の暗黙的な読み取り専用の性質でした。そのようなシナリオでは、私は自分のテキストを握ります。このようにLuaを読み書きで使用する場合、まったく意味がありません。多くの点で、ファイルシステムメタデータはほとんど読み取り専用であるため、このようなアプローチは完全なro要件を意味しません。
akauppi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.