データベースの使用は、テキストファイルからのデータの解析よりも優先されるべきですか?


13

codereview.SEの成長を測定するPythonプログラムを作成していました。私のアプローチは、フロントページに表示される「サイトの統計」を取得し、ハードドライブに保存することでした。これは毎日1回行う予定です。これまでに、統計を取得してテキストファイルに追加するのに十分な量を作成しました。Pythonスクリプトはgithubで表示できます。私が使用している形式は次のとおりです

22-08-2013

questions 9073
answers 15326
answered 88
users 26102
visitors/day 7407

22-08-2013

questions 9073
answers 15326
answered 88
users 26102
visitors/day 7407

スクリプトを2回実行して、ファイルで使用する形式を取得しました。最初は自分で保存するので、フォーマットは同じであるため、簡単に解析できますが、よくわかりません。データベースを使用する方が、データを取得する方が簡単であるため、ここではより良いはずです。ただし、データベースを使用したことがなく、SQL、MySQL、またはRDBMSのその他のバリアントについての知識もありません。

だから、これは私に質問をもたらします。データをテキストファイルに保存するよりも、データを保存するのにデータベースを優先すべき場合 データベースが必要なのか、単純なテキストファイルが必要なのかを判断する際に参照できるポインタはありますか?

PS:より良いタグを追加できる場合は追加してください。追加できるタグについて疑問がありました。


「ツールの使用方法を学ぶまで、すべてのツールには責任があります。」
ジェフ

1
データベースは、プロジェクトに適している場合とそうでない場合があります。ただし、より単純な形式を使用すると役立つ場合があります。Pythonに標準のCSVモジュールがあり、使用を検討できます。CSVを使用すると、他のプログラムへのデータのエクスポートが簡単になります(たとえば、グラフ化できるようにスプレッドシートに)。
ショーンマクサムシング

回答:


13

データをテキストファイルに保存するよりも、データを保存するのに適したデータベースはいつですか?

ウィキペディアは教えてくれることを、データベースがデータの整理コレクションです。その対策により、テキストファイルデータベースになります。それは言い続けます:

通常、データは、この情報を必要とするプロセスをサポートする方法で、現実の関連する側面をモデル化するために編成されます。たとえば、空室のあるホテルの検索をサポートする方法で、ホテルの部屋の空室状況をモデリングします。

その部分は主観的です-どのようにデータをモデル化するべきか、どの操作を最適化する必要があるかを具体的に教えてくれません。テキストファイルは、毎日1つずつ、多数の個別のレコードで構成されているため、問題に関連する方法で現実の側面をモデル化しています。

「データベース」と言うと、おそらく何らかのリレーショナルデータベース管理システムを考えているのに、テキストファイルをデータベースと考えると、「データベースをいつ使うべきか」という質問が変わることがわかります。「どのようなデータベースを使用すればよいですか」その観点から物事を見ると、答えがわかりやすくなります。持っているデータベースが要件を満たさなくなったときに、より良いデータベースを使用します。

Pythonスクリプトと単純なテキストファイルが十分に機能する場合は、変更する必要はありません。1日あたり新しいレコードが1つだけで、コンピューターの速度が毎年向上しているため、現在のソリューションは長期にわたって実行可能であると思われます。10年分のデータでは、3650レコードしか得られませんが、一度解析すると、おそらく75キロバイト未満しか必要ありません。

1日あたり1つの小さなレコードではなく、CodeReviewで尋ねられたすべての質問、誰が、いつ尋ねたかを記録することにしたと想像してください。さらに、すべての回答と関連するメタデータも収集します。君はすべてをテキストファイルに保存もできますが、フラットファイルを使用すると、必要なときに情報を見つけることが難しくなります。全部をメモリに読み込むにはデータが多すぎるので、質問や回答を見つけたいときはいつでも、探しているものが見つかるまでファイルをスキャンする必要があります。特定のユーザーからの質問をすべて検索したい場合は、ファイル全体をスキャンする必要があります。タグとして「バグ」を含むすべての質問を検索する場合は、ファイル全体をスキャンする必要があります。

それは恐ろしく遅いので、特定のレコードを見つけるためにファイル内のどこを見るべきかを示すいくつかのインデックスを構築することによって、物事をスピードアップすることに決めるかもしれません。質問用のインデックス、ユーザー用のインデックス、回答用のインデックスなどを作成できます。質問を見つけたいときは、(はるかに小さい)質問インデックスを検索し、メインデータファイル内の質問の位置を取得し、ファイル内の適切な場所にすばやくジャンプします。それはパフォーマンスの大きな改善になるでしょう。実際、それはデータベース管理システムとほとんど同じです。

したがって、必要なときにDBMSを使用してください。大量のデータがある場合、そのデータに迅速にアクセスできるようにする必要がある場合、おそらく最初は完全に予測できない方法で使用します。互いに接続された異なる種類のデータ(異なる種類のレコード)がある場合は、RDBMSを使用して、さまざまなレコードを適切に関連付けることができます


3
「テキストファイルをデータベースの変更と考える」非常に洞察に富んでいます。また、3650エントリしか持っていない私の部分も役に立ちました。問題の本当の視点を得るのに役立ちました。
アシームBansal

1
非常に過小評価された答え、これは私がそれに戻ってきた2度目です。
ハシム

6

データベースには多くの利点がありますが、アクセスが簡単になりますはそれらの1つではありません。より速く、より標準化され、埋め込みコマンドのサブ言語として解釈可能、より安全、はい-しかし、簡単ではありません。あなたの言語と標準ライブラリがどれだけの構文糖を提供していても、最初にデータベースを用意し、それへの接続を開いて、プログラムからのデータをまったく異なるものに戻し、戻す必要があります。あなたが何をするかに問題がなく、プログラミングの容易さがあなたの優先事項である限り、それが「良い習慣」だと思うからといって、データベースに決して切り替えないでください。

いつ切り替えるべきかについての私の考えは、歴史的発展に従うことです。結局、リレーショナルDBが発明されるまで、人々は長い間ファイルにデータを保存していました。実際、その前に、多数の下位データベースモデル(階層DB、ネットワークDB ...)が発明されました。彼らはデータベースの作成を開始し、これが大きな処理労力を節約し、全体的および長期的に信頼性を向上させることが明らかになったときにそれらを使用しました。それがあなたに当てはまらない限り、そしてあなたがそれがいつかすぐに当てになることを予見しない限り、切り替えは過剰なエンジニアリングになるでしょう。


全体的なデザインに応じて、粘着性は向上しませんか?たとえば、私の場合、各日付に対応する5つの値を保存しています。現在の状態では、データ間に凝集性はありません。
アシームバンサル

そうです、すべてのレコードに一貫したフィールドと値のセットがあることを確認することも、これらの利点の1つです。(厳密に言えば、それを保証するのはリレーショナルデータベースのみです。人々は本番
環境で

3

もちろんこれは判断の呼び出しになりますが、私が検討する3つの主要な基準は、ACID準拠である必要があるか、データがどれだけ複雑であるか、最後に読み取り/書き込みに必要なものの数です。単に1行ずつ読み書きし、アプリが読み書きを行う唯一のアプリである限り、おそらくデータベースをスキップできます。複数のアプリの読み取りまたは書き込みを開始するか、データ構造が複雑になると(特に個別の行間に関係がある場合)、DBは非常に魅力的に見え始めます。


「読み取り/書き込みに必要なものの数」-それが役立ちました。
アシームバンサル

2

データベースは、データを保存するだけでなく、データを操作およびクエリするために使用されるため、教育に基づいた決定を下す必要があります。

大きな要因は、マシンにデータベースをインストールすることで得られる利点と、それがもたらす機能です。

明らかに、データのクエリと操作が必要で、アクセスを迅速にしたい場合-さらに、他の機能にデータベースを使用することを考えている場合、それは良い考えかもしれません。データベースストレージモデルを使用すると、キー値によってデータを非常に迅速に検索でき、ファイルの解析が遅くなる可能性があります(その方法によって異なります)

SQLとその機能を試してみたい場合は、SQLFiddle.comにいくつかの異なるRDBMSモデルがあります(クエリの実行、スキーマの作成など)。


Pythonには、組み込みの標準ライブラリインターフェイスがありsqlite3ます。したがって、データベースのインストールは問題ではありません。私の考慮事項は、データを保存し続けると、何らかのインデックス付けがない限り、遅くなる可能性があるということです。データベースがそれを処理できると思います。sqlite3を個別にダウンロードして学習しましたが、データベースを使用する前にデータベースモデルについて学習する必要があることがわかりました。インターネットベースの例を使用してsqlite3を学習できますが、現在データベースモデルの学習に問題があります。それからそれはトラブルの価値があるかどうかは私の頭に浮かんだ?
アシームバンサル

2

常にデータベースを使用するかどうかは、何をする必要があるかに依存します。大量のデータがあり、その上でさまざまなクエリを実行する必要がある場合は、おそらくデータベースが役立ちます。

あなたの場合、パフォーマンスが許容できるまでストレージをテストファイルに保存します。通常、テキストファイル(大きい場合でも)の読み込みにはそれほど時間がかかりません。さらに必要な場合は、後でデータベースをいつでも追加できます。

私の経験では、データベースにまったく慣れていない場合は、couchdb:http ://couchdb.apache.org/のようなもの(no-sqlを使用)を使用すると簡単に見つかります。クエリにはjavascriptやpythonなどを直接使用できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.