ページへ戻る

− Links

 印刷 

Python​/データベースの選択 のソース :: NJF Wiki

xpwiki:Python/データベースの選択のソース

« Prev[3]  
*始めに [#l43cae65]

Pythonで開発していて、大量のデータをあつかうようになると、データベースを使いたくなることが良くあります。

Webシステムなどではもやはデータベースは必須ですが、個人でちょっとしたものを作る時でも、ファイルよりもデータベースの方が扱いが楽なことが多いです。

Pythonはかなりいろいろなデータベースが使え、ほとんどのメジャーなデータベースはAPIがあると思って良いでしょう。

なかでも、個人や小規模開発で使う場合は以下のSQLiteと、MySQL、MongoDBを使うことが多いと思います。

そんなときに、どれを選択するかの基準となるように、簡単にそれぞれの特長を紹介します。

*なぜデータベースを使うのか [#c4b009d2]

たまに「データの保存ならファイルでも良いのではないか」と言う人もいるので、そもそもなぜデータベースを使うのかを、通常のファイルでのデータの管理の問題点を通して簡単に説明しておきます。

**1データ1ファイルの問題点 [#k57307d2]

誰でも最初に思いつくデータ管理法として、1データを1ファイルごとに入れていく、という物があります。しかしこれには大きな問題があります。

実例として以下のようなことがありました。
以前、仕事で通信系のプログラムのテスト用に1通信を1ファイルにして流し込む、ということをやっていた同僚がいました。

かなり頻繁に通信を行うプログラムで、そのファイルが数十〜百万以上になっていました。するとどうなるかというと、通常のOSはそのような大量のファイルを効率よくあつかうようにはなっていないため、ファイルをリストで表示することもできず、移動にも大変な時間がかかるという、とてもやっかいなことになりました。例えばlsコマンドを打ってファイル名を表示するだけで数分かかって、しかも大量の表示が流れてしまい、実質役に立たない、tarなどでまとめないと開発機からテスト機へデータを移すだけで数時間かかる、そのtarコマンドの実行にも時間がかかる、といったぐあいです。

テスト用の使い捨てのプログラムだったため、いくつかのフォルダに分割したり、xargsなどのコマンドを駆使しながら乗り切りましたが、現実に運用するシステムなら大変な事になっていたでしょう。

このようなとき、データベースを使っていれば、運用はとても楽になります。データベースソフトは通常大量のデータを一つのファイルにまとめているので、データの一覧表示や消去、移動、検索もあっという間にできます。

経験的には、ファイル数が1000を越えたら、データベースを使ったり、複数ファイルを一つにまとめる独自フォーマットのファイルを作るべきです。

特殊なフォーマットでデータベースが使えないときは独自フォーマットを使うしかありませんが、そうではないならデータベースを使えば既存の機能が使えて便利です。

**データへの同時アクセスの問題 [#w29afb76]

他に、データベースの中でもサーバーを使うタイプの場合は、複数プロセスからのデータの同時利用が簡単になるというのも大きな利点です。

データの同時アクセスというのはプログラムを行う上ではかなりやっかいな問題です。

例えば、Aというプログラムが「a」「b」「c」と書き込みBというプログラムが「d」「e」「f」と書き込んで、最終的に「abcdef」となることを期待しているとしましょう。

しかし、もしAが「a」と書いたときにBが 「d」と書いてしまうと結果が「adbcef」となってしまいます。
1データ程度がおかしくなるならまだそれほど問題がないかも知れませんが、ファイル全体の情報を書き込んでいる部分などでこれが起こると、最悪そのファイル自体が使えなくなります。

CENTER:&ref(pythonDB.jpg,mw:480,mh:360);

このため、Aが書き込みを行っている間はBが書き込めないようにファイルをロックしたりするのですが、これがかなりやっかいで、タイミングによってロックがうまく行かなかったり、ロックの処理が遅すぎて全体の処理が遅くなったり、ロックが外れずに誰も書き込めなくなったり、といったことが起きます。

このあたりは、昔、今ほどレンタルサーバーがデータベースを提供していなかったころ、cgiでカウンターや掲示板を作っていた人は頭を悩まされた部分です。「cgi ファイル ロック」などで検索すると、先人の苦労のあとがわかるでしょう。

サーバーを使うタイプのデーターベースの場合、このファイルのロックや書き込み順をサーバープログラムが行ってくれるので、データへの同時アクセスの問題はほぼなくなりました。

また、前述のcgiの問題も現在では多くのレンタルサーバーでデータベースが使えるようになったことから、問題視されることはまれです。

CENTER:&ref(pythonDB2.jpg,mw:480,mh:360);

**多くのデータを扱うとき、データへの同時アクセスがあるときはデータベースを利用する [#j84abca0]

以上のような理由から、多くのデータを扱うなら、ファイルよりもデータベースを使った法が便利です。

また、同時にデータにアクセスするなら、サーバーを立ち上げるタイプのデータベースソフトを使うのがおすすめです。

*各データベースの特長 [#r64d081f]

ここではよく使われるSQLite、MySQL、MongoDBなどのデータベースの特長などを解説します。他にもたくさんのデータベースがあり、それぞれに特徴があります。商業用などで使うならできるだけたくさんの情報を仕入れることをおすすめします。個人や小規模開発などではまずこの3つが入門になるかと思います。

**データベースの種類 [#abb23c07]

データベースソフトには大まかにはサーバーを使う物と使わない物、リレーショナル型とNoSQLのものがあります。

|名前|サーバー|タイプ|
|SQLite|なし|リレーショナル型|
|MySQL|あり|リレーショナル型|
|MongoDB|あり|NoSQL|


サーバーがあるものは、データの同時アクセスを制御する機能があり、Webプログラムなどにも向いてます。そのかわりサーバーの設定などが必要でちょっとした用途にはかなり面倒です。人にプログラムを渡して、すぐ使ってもらう、というわけにも行きません。一方サーバーを使わない物はすぐ簡単に使えますが、同時アクセスが必要な大規模開発には向いておらず、スタンドアロンの小規模での開発がおすすめです。

リレーショナル型は集計や表の結合などが得意ですが、データ構造の柔軟な変更などは難しくなります。
NoSQLは集計や表の結合などはできませんが、後からデータ構造を変えたり、大規模データの扱いがしやすくなるなるなどの特徴があります。

ちなみにNoSQLという名前ですが、SQLを使わないという意味ありません。NoSQLはリレーショナル型ではない、という意味で使われています。実際、Google App EngineのビッグテーブルはNoSQLですが、使う文法はSQLによく似ています。

**SQLite [#va9260c7]
&ref(sqlite370_banner.gif,mw:480,mh:360);

公式サイト[[http://www.sqlite.org/]]

機能は少なめで軽量かつ高速で動作し、小さなデータを扱ったり、同時に複数のプロセスからアクセスされないような場合には便利なデータベースです。

他のデータベースのようにサーバープログラムを必要とせず、簡単にインストールして利用できるのも利点です。

そのかわり型などは少なく、複雑な処理をデータベース上で行う事もできません。
また同時に複数のプロセスで利用もできないので、Webサーバーでのプログラムにも向きません。

スタンドアロンのアプリなどの開発などに向いているデータベースです。

SQLiteをPythonを使う例は[[Python/SQLiteから使う基礎]]を参照のこと。

**MySQL [#b83158bb]

&ref(powered-by-mysql-167x86.png,mw:480,mh:360);

公式サイト[[https://www-jp.mysql.com/]]

Webサーバーなどでも良く利用されている実績のあるデータベースで、かなり複雑なこともできます。サーバープログラムを介してファイルにアクセスするため、複数プロセスで同時に利用できます。

インストールや設定にはある程度技術が必要で、慣れていないと気軽に利用とは行かないかも知れません。

Webサーバーでの利用、特にデータベース上で集計や表の結合などを行うときにおすすめのデータベースです。

MySQLをPythonで使う例は[[Python/MySQLから使う基礎]]を参照のこと。

**MongoDB [#i641ea2d]

&ref(mongo.png,mw:480,mh:360);

公式サイト[[https://www.mongodb.com/]]

最近よく使われるようになった「NoSQL」と呼ばれる物の中で、最もシェアの高いデータベースです。

表の結合、集計と行った処理はあまり得意ではありませんが、代わりに大規模データを扱いやすくなっています。例えばクラウド環境のようにデータが分散しているときでも使えるようになっています。またデータの定義なども後から柔軟に変えられます。このような部分はMySQLなどのRDBMSでは難しい所です。

データーの規模が大きく、集計などを行わない場合におすすめです。

*まとめ [#q32518fc]

大量のデータを扱うならなるべくデータベースを使うようにしましょう。データがどんどん増える予定なのに、うっかりファイルで保存とか行っていると、あとで大変な事になるかもしれません。

Pythonでとりあえず練習用に使うならSQLiteがおすすめです。
また設定などを読み込むのに、データが多くてファイルでは管理が大変というときなどにもSQLiteがおすすめです。一方、ちょっとした設定などの保存はデータベースではなく、ConfigParserがおすすめです。詳しくは「[[Python/設定ファイルの読み込み]]」を参照のこと。

ただし、複数プロセスで同時にアクセスするならMySQLやMongoDBなどを用途にあわせて使うようにすると良いでしょう。

この二つを比較するなら、MySQLの方が資料は多めでSQLiteとも共通部分が多くとっつきやすく、一般的なシェアも多く導入しやすいです。MongoDBは記法が独特でちょっとやりづらいところもありますが、データの構造が頻繁に変わるような場合にはこちらの方が良いかも知れません。

« Prev[3]