データ構造を使用するアルゴリズムとデータベースを使用するアルゴリズムの違いは何ですか?


10

一般的な質問

データ構造を使用するアルゴリズムとデータベースを使用するアルゴリズムの違いは何ですか?

いくつかのコンテキスト

これはしばらくの間私を悩ませてきた質問であり、私はそれについて説得力のある答えを出すことができませんでした。

現在、もちろん、データ構造に深く関わるアルゴリズムの理解を深めることに取り組んでいます。これらは、バッグ、キュー、スタック、優先度キュー、ヒープなどの基本的な構造です。

また、データベースを日常的に使用して、エンドユーザーによって処理および送信された、またはプログラムによって処理されたデータを保存します。データベースのテーブルに基づいて生成される独自のデータ構造を持つDALを介して、データを取得して送信します。

私の質問は、データベースを使用してデータをソートして、昇順/降順で注文したデータを返送するか、データを取得してロジックにロードし、このデータを優先度キューで処理し、ヒープソートするオプションがあるときに発生しますそれのすべて。または、レコードのサブセットをロードするのではなく、データベースを使用してレコードを検索し、バイナリ検索のようなものを使用して、興味のあるレコードを見つけることもできます。

私の考えでは、通信は高価であるため、送信する前に、データベース側でできるだけ多くの操作を実行しようと思います。また、データベースのデータではなく、独自のロジック内で厳密に定義されたアルゴリズムとデータ構造を使用してデータを処理するのはいつですか。

だからここに質問があります...

ご質問

  1. データ構造とデータベースの違いは何ですか?
  2. データベースのロジックではなく、独自のロジック内でのみ定義されたデータ構造を使用するアルゴリズムをいつ使用しますか?
  3. @Harveyの投稿:データベース内のメソッドを使用すると、独自のロジック内のメソッドよりも効率が悪くなりますか?
    • @mirculixxの投稿:メソッドを効率的にするものは何ですか?
  4. @Harveyポスト:データベースで行うよりもデータ構造でデータを処理する方が高速ですか?

明確化

  1. @Grant post:私が通常使用するデータベースはリレーショナルであり、これらの質問はそれらを使用することから生まれています。ただし、これらの質問はどの永続フレームワークにも適用できると思います(フレームワークとは、最も一般的な意味での意味です)。

特定の文脈がないと答えが難しいことは知っています。考えられる食べ物、アドバイス、または議論のポイントは、主に私が探しているものであり、最もありがたいです!


datomic.comのデータベースは、従来のリレーショナルのものよりユーザーに近いです。従来のデータベースだけを見ていますか?
ジョブ

@ジョブいいえ、ここで検討しているのはリレーショナルデータベースだけではありません。ロジックのデータ構造とデータベース/永続性ユニットのデータ構造の違いを理解することについてです。
hulkmeister 2013年

一般的なルールとして、できる限りデータベースを使用しますが、データベースが遅くなりすぎた場合は、データ構造を使用することをお勧めします。2つを同期させる必要があるため、データの複製(キャッシュなど)は不適切です。できない場合を除いて、データの複製は避けてください。
ジョブ

データをデータベースに送信してソートするだけですか?あなたの心を変えるためにブロックの周りを運転するのが好きですか?

回答:


18

データ構造は、ほとんどの場合、次のとおりです。

  1. メモリ常駐、
  2. 一時的、
  3. サイズ限定、
  4. ロックや不変性などの同時実行メカニズムを追加しないと再入できません。
  5. ACIDに準拠していない、
  6. 慎重に選択すれば高速。

データベースは、ほとんどの場合、次のとおりです。

  1. ディスクバインド、
  2. 持続的、
  3. 大、
  4. 安全に同時、
  5. ACID準拠、トランザクション機能、
  6. データ構造より遅い

データ構造は、ある場所から別の場所に渡され、プログラム内で内部的に使用されることを意図しています。データベースを使用してWebページからWebサーバーにデータを最後に送信したのはいつですか、または完全にメモリに常駐していたデータベースで計算を実行したのはいつですか。

データベースシステムは、内部実装の一部としてデータ構造を使用します。それはサイズと範囲の問題です。プログラム内でデータ構造を使用しますが、データベースシステムそれ自体がプログラムです。


WebページからWebサーバーへの発言については、そこでデータベースを使用しないことに同意しますが、そのデータを処理または変換してデータベースに永続化するサーブレットが存在する可能性はあります。それは、物事が少し混乱する中間層とデータ層の間にあります。質問を簡単にするために、データベースのメソッドは、ロジックのメソッドよりも使用するメリットが少なくなるのはいつですか?
hulkmeister 2013年

1
まあ、それはDALのパンとバターですね。DALは、オブジェクトとデータベースレコード間の移行を容易にするために存在します。DALは、データベースを使用する場合の約80〜90%に適していますが、残りの10〜20%の場合は、SQLより効率的であるため、生のSQLまたはストアドプロシージャに戻すことができます。
Robert Harvey

並べ替え/フィルター処理の例では、おそらくデータベースサーバーでそのような処理を実行する必要があります。ただし、その処理の結果は、なんらかの形式のデータ構造として引き続き受け取る可能性があります。
Robert Harvey

あなたが与えたポイントは本当に有益でした。ただし、データベースで直接、またはロジック内のデータ構造のみで、またはその両方で機能するメソッド(またはアルゴリズム)については、まだ問題があります。あなたが書き留めた両方のリストの項目6を見ていますが、頭に浮かぶのは、どちらがどれだけ速いかということです。私は常に、ソースでデータを処理することが、物事を進めるための最速の方法であると認識してきました。投稿内で更新できます。もう一度読みます。
hulkmeister 2013年

1
データベースはいくつかの理由で遅くなります。キャッシュにもかかわらず、コンパイルする必要のあるSQLステートメントを使用してディスクからデータを読み取る必要があり、実行プランには複数のテーブルが頻繁に含まれます。プロセスははるかに複雑です。さらに、通常は引き続き結果をネットワーク経由で転送する必要があります。そこで、データをデータ構造に変換して、操作できるようにします。
Robert Harvey

6

データ構造とデータベースの違いは何ですか?

抽象レベルでは何もありません-データベースデータ構造です。

特定のレベルでは、データベースは通常、挿入、更新、取得、結合、またはその他の目的(または組み合わせ)のいずれかに最適化された形式で、データを永続化する目的を持っています。

たとえば、RDBMSのテーブルを比較してデータの配列を言う場合、違いは、アルゴリズムのランタイム、書き込む必要があるコードの量、アルゴリズムを実行するために必要なメモリの量、またはプログラム/アルゴリズムの外部からデータを操作/アクセスする柔軟性。

データベースのロジックではなく、独自のロジック内でのみ定義されたデータ構造を使用するアルゴリズムをいつ使用しますか?

傾向で私は主張します

a)特定のアルゴリズムの実行時または目的を超えてアクセス可能な方法でデータを永続化する必要がある場合は、データベースを使用する。

b)実行時の速度が重要な場合、または永続性が必要ない場合は、独自の(メモリ内の)データ構造を使用する

たとえば、アルゴリズムが顧客レコードを処理する場合、それらの顧客レコードを保存して(たとえば、特定の領域ですべての顧客を見つける)、後で他のプログラム/アルゴリズムで使用したり、まったく異なる目的(たとえば、最も価値のある顧客を見つける)に使用したりできます。 )。その場合は、データベースを使用してデータを永続化することをお勧めします。

ただし、パフォーマンス上の理由から、必ずしもデータを永続化しないインメモリデータベースの概念があることに注意してください。たとえば、RedisHANAです。

データベース内のメソッドは、独自のロジック内のメソッドよりも使用効率が低下するのはいつですか?

答えは、状況と使用しているデータベース(のタイプ)に大きく依存します。私は質問を「メソッドを効率的にするものは何か」に言い換えます。その後、データベースで使用されるメソッドと独自のデータ構造で使用するメソッド(=アルゴリズム)を評価する練習になります。次のポイントも参照してください。

データベースでデータを処理するよりも、データ構造でデータを処理する方が高速ですか?

繰り返しますが、これは詳細に依存します。一般に、メモリ内にあり、アルゴリズムを実行するプロセスに直接アクセスできるデータの処理は、(同じコンピューターまたはネットワークを介して)別のプロセスに要求を送信し、結果を返すように要求するよりも高速です。 。ただし、データがすでにデータベース内にある場合は、コマンド(2つのテーブルを結合して集計関数を計算するSQLステートメントなど)を送信し、データの小さな要約またはサブセットのみを取得する方が、最初にすべてを転送するよりもはるかに効率的です。データとローカルでの結果の計算(独自のデータ構造を使用)。


1

ディスクアクセスは、主にこの操作で最もコストがかかるものであり、ネットワークアクセスよりも頻繁です(http://serverfault.com/questions/238417/are-networks-now-faster-than-disks)。データベースが1 Gbps以上のネットワーク上になく、web \ applicationサーバーと同じネットワーク上にない限り、ネットワークパフォーマンスは、大規模なデータセットのディスクパフォ​​ーマンスほど重要ではありません。または、データが非常に高速なソリッドステートディスクにある場合、通常のネットワークアクセスよりも高速になります。また、データベースは通常、データベースがアプリケーションサーバーと同じサーバー上にある場合、TCP / IPを使用する代わりに名前付きパイプのようなIPCメカニズムを提供します。

リクエスト間でメモリ内のほとんどのデータ構造を\ n維持できる場合、これが一般的に最速の賭けになります。それができない場合、特に何百万ものレコードがあるシステムでは、レコードの小さなセット以外の検索と更新のパフォーマンスのために、正規化されたテーブルと適切なインデックスを備えた優れたデータベース構造を打ち負かすことは困難です。

リレーショナルデータベースは通常、B +ツリーまたはそのバリアントを内部で使用し、頻繁にアクセスされるレコードのディスクおよびバッファープールでのデータアライメントなどの多くの最適化を行います。これにより、特に集計やフィルタリングが含まれる場合に、大規模なデータセットの処理に優れています。


これが正しいかどうか教えてください。私がデータを操作することを考えるときはいつでも、あなたが言ったことを適用すると、ワーキングセットをメモリにキャッシュしておくことができれば、より高速になります。それ以外の場合は、データベースを使用してそれらの結果を配信するか、データベースへのクエリを実行する方法を見つけますか?
hulkmeister 2013年

@hulkmeisterはい、データセットが非常に小さい場合、またはデータベースが低速ネットワーク上のユーザーの場所から離れている場合を除いて、通常はそうです。
Peter Smith

0

データベースとはどういう意味ですか?MySQLやSQL Serverなどのリレーショナルデータベースを意味しますか?リレーショナルデータベースは、リレーショナルモデルで定義された操作の一部をサポートするメタデータ構造です。60年代にEdgar Coddが主に作成したリレーショナルモデルの理論。

リレーショナルモデルは非常に汎用的で柔軟ですが、データの構造やアクセスのパターンを利用することはできません。データ構造は、データとそのデータへのアクセス方法について何か知っている場合に役立ちます。たとえば、データ構造に入力した最後のデータが最初に必要なデータになることがわかっている場合は、スタックを使用できます。

リレーショナルデータベースは、スタック、キュー、ツリー、リストなどの多くのデータ構造を使用してリレーショナルテーブルの抽象的なデータ構造を作成するソフトウェアのかなり大きな塊であるため、リレーショナルデータベースをメタデータ構造と呼びました。


申し訳ありませんが、最後の段落に関して「かなりのビットワッド」が何を意味するのかを明確にする必要がありますか?
hulkmeister 2013年

@hulkmeister、申し訳ありませんが、「ビット」ではなく「大きい」べきでした。リレーショナルモデルは非常に抽象的でかなり複雑です。。ACID((原子性、一貫性、独立性、耐久性)が背後で実行されている、かなり洗練されたコードの多くがかかっ提供し、特に1、実装を提供する十分に実際に行っていること
チャールズ・E・グラント
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.