私はPythonの成長を測定するプログラム codereview.SE を作成していました。私のアプローチは、フロントページに表示される「サイト統計」を取得し、それらを保存することでした。私のハードドライブです。これを毎日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:より良いタグを追加できる場合は、追加してください。追加できるタグについて疑問がありました。
テキストファイルにデータを保存するよりも、データベースを使用してデータを保存する場合
Wikipedia tells us thatデータベースは整理されたデータの集まりです。その手段によって、あなたのテキストファイルはデータベースです。それは続けて言う:
データは通常、この情報を必要とするプロセスをサポートする方法で、現実の関連する側面をモデル化するために編成されます。たとえば、空室のあるホテルの検索をサポートする方法で、ホテルの部屋の空室状況をモデル化します。
その部分は主観的です-データをどのようにモデル化する必要があるか、どの操作を最適化する必要があるかを具体的に示すものではありません。テキストファイルは、毎日1つずつ、多数の異なるレコードで構成されているため、問題に関連する方法で現実の側面をモデル化しています。
「データベース」と言ったとき、おそらく何らかのリレーショナルデータベース管理システムについて考えていることでしょうが、テキストファイルをデータベースとして考えることで、「データベースをいつ使用すべきか」という疑問が変わります。 「どのようなデータベースを使用すればよいですか?」 入手したデータベースが要件を満たしていない場合は、より良いデータベースを使用してください。
Pythonスクリプトと単純なテキストファイルが十分に機能する場合は、変更する必要はありません。毎年1つの新しいレコードのみがあり、コンピュータは毎年高速化しているため、現在のソリューションは実行可能であると思われます10年分のデータでは、3650のレコードしか得られず、一度解析すると75キロバイト未満で済みます。
1日あたり1つの小さなレコードの代わりに、CodeReviewで尋ねられたすべての質問、誰がいつ行ったかを記録することにしたとします。さらに、すべての回答と関連するメタデータも収集します。すべてできますすべてをテキストファイルに保存できますが、フラットファイルを使用すると、必要なときに情報を見つけることが難しくなります。データが多すぎて全部をメモリに読み込むことができないため、質問や回答を見つけたいときはいつでも、探しているものが見つかるまでファイルをスキャンする必要があります。特定のユーザーからの質問をすべて検索したい場合は、ファイル全体をスキャンする必要があります。タグとして「バグ」が含まれるすべての質問を検索する場合は、ファイルをスキャンする必要があります。
これはひどく遅いので、特定のレコードを見つけるためにファイル内のどこを検索するかを示すいくつかのインデックスを作成することで、速度を上げることができます。質問用のインデックス、ユーザー用のインデックス、回答用のインデックスなどがあります。質問を見つけたい場合は、(はるかに小さい)質問インデックスを検索し、メインデータファイル内の質問の位置を取得して、ファイルの適切な場所にすばやくジャンプします。それは大きなパフォーマンスの改善になるでしょう。実際、それはデータベース管理システムとほとんど同じです。
したがって、必要なときにDBMSを使用します。大量のデータがあり、そのデータにすばやくアクセスできる必要がある場合に使用します。おそらく、最初から完全に予測することはできません。互いに接続されている異なる種類のデータ(異なるタイプのレコード)がある場合は、RDBMSを使用して、さまざまなレコードを適切に関連付けることができます。
データベースには多くの利点がありますが、アクセスより簡単にすることはその1つではありません。より速く、より標準化されており、埋め込みコマンドのサブ言語として解釈可能で、より安全です。ただし、簡単ではありません。言語と標準ライブラリが提供する構文糖度に関係なく、最初にデータベースを用意し、データベースへの接続を開いて、プログラムからのデータをまったく異なるものにルーティングして戻す必要があります。作業に問題がなく、プログラミングの容易さが最優先である限り、「良い習慣」だと思っているからといって、データベースに切り替えないでください。
いつ切り替えるかは、歴史的な進展を追うことです。結局のところ、リレーショナルDBが発明されるまでの長い間、人々はデータをファイルに保存していました。実際、その前に、多数の劣ったデータベースモデル(階層DB、ネットワークDB ...)が発明されていました。彼らはデータベースの作成を開始し、これにより主要な処理労力が節約され、信頼性などが向上することが明らかになったときにそれらを使用しました全体および長期的に。それが当てはまらない場合、およびすぐにそうなると予測しない限り、切り替えは過剰に設計されます。
これはもちろん判断の呼び出しになりますが、私が検討する3つの主な基準は次のとおりです。それは [〜#〜] acid [〜#〜] に準拠する必要があるか、データがどの程度複雑か、そして最後に多くのことを読み書きする必要があります。単に1行ずつ読み書きし、アプリが読み取りまたは書き込みを行う唯一のアプリである限り、おそらくデータベースをスキップできます。複数のアプリの読み取りまたは書き込みを開始したら、書き込みを行うか、データ構造が複雑になると(特に、別の行間に関係がある場合)、DBは非常に魅力的に見えます。
いつものようにデータベースを使用するかどうかは、何をする必要があるかに依存します。大量のデータがあり、そのデータに対してさまざまなクエリを実行する必要がある場合は、おそらくデータベースが役立ちます。
あなたの場合、パフォーマンスが許容範囲になるまで、ストレージをテストファイルに保存します。通常、テキストファイル(大きい場合でも)の読み取りにはそれほど時間がかかりません。さらに必要な場合は、後でデータベースをいつでも追加できます。
私の経験では、データベースに完全に慣れていない場合は、couchdb( http://couchdb.Apache.org/ )のようなものを使用する方が簡単かもしれません。 no-sqlを使用すると、クエリに直接JavaScriptまたはPythonなどを使用できます。
データベースは、データの格納だけでなく、操作やクエリにも使用されるため、知識に基づいた決定を行う必要があります。
大きな要因は、マシンにデータベースをインストールすることで得られる利点と、データベースがもたらす機能です。
データをクエリして操作する必要があり、アクセスを高速にしたい場合はもちろんです。さらに、他の機能にデータベースを使用することを検討している場合は、それが良いアイデアかもしれません。データベースストレージモデルを使用すると、キー値によってデータを非常に迅速に検索でき、ファイルの解析を想像できますcould遅くなります(方法によって異なります)
SQLとそれで何ができるかを試したい場合、SQLFiddle.comにはいくつかの異なるRDBMSモデルがあります(クエリの実行、スキーマの作成など)。