Python学習【365日チャレンジ!】138日目のマスターU(@Udemy11)です。
データベースという名前を聞くだけでちょっと逃げたくなってくるのは私だけでしょうか?
初めて使ったパソコンがMacだったので、マウスを使うGUI(グラフィカルユーザーインターフェース)から入ったので、コマンドを使って操作するイメージの強いデータベースは、ちょっととっつきづらく、無意識のうちに拒否反応が起こっちゃうんです。
とはいえ、データベースを理解しないことには、プログラミングをマスターすることはできないので、少しずつ理解を深めたいきたいと思います。
それでは、今日のPython学習をはじめましょう!
昨日の復習
昨日は、コマンドライン引数を便利に扱うArgumentParser
について学習しました。
コマンド入力から引数を渡して処理をさせることができましたが、独自の引数を定義してPythonファイルで受け取り処理できるようにするのがargparse
でした。
Pythonファイル内からコマンド入力を操作できるsubprocess
がありましたが、argparse
はコマンド入力からPythonファイルに引数を渡すので、ある意味この2つは反対の役割を持っていると言えるでしょう。
詳しいことは昨日の記事をごらんください。
学習するデータベース
これから学習するデータベースは大きく分けて2つになります。
ネットワーク型や階層型、リレーショナル型といった分け方もありますが、今回はリレーショナルデータベースとNoSQLという大きな括りで分けています。
現状で、データベースと言えば、SQL(Structured Query Language)を使うリレーショナルデータベースを思い浮かべる人がほとんどじゃないかおもいます。
このリレーショナルデータベースと、そのほかのSQLを使わないNoSQL(Not only SQL)を学習します。
データベースは必要なデータのかたまりなので、データ処理が早いのが特徴ですが、リレーショナルデータベースはプログラムが複雑化しやすく、データ量が増えると処理速度が遅くなるという課題があり、その課題をカバーしようとしているのがNoSQLです。
それではリレーショナルデータベースの基本から学習していきます。
リレーショナルデータベース
リレーショナルデータベースは、行と列を持つテープルのデータ項目をつなげたデータの構造体です。
複数のテーブルを関連付けて一つのデータ構造を作ることができ、SQL(構造化クエリ言語)を使ってデータを追加・変更・削除をすれば、データ構造体も関連して更新されます。
リレーショナルデータベースには、比較的簡易なSQLiteや普及率の高いMySQL、AWS(AmazonWebService)が提供するAmazon Aurora、Oracle Database、Microsoft SQL Server、PostgreSQLなどがありますが、比較的扱いやすいSQLiteとWordPressでも使われているMySQLについて学習します。
SQLite
SQLiteは、ファイルで扱うデータベースで、他のリレーショナルデータベースと違い、サーバーを用意する必要がありません。
ファイルを直接データベースとして扱うので、他のデータベースに比べできることは限られますが、SQLを使う他のリレーショナルデータベースと共通する部分がほとんどなので、まずはSQLiteでデータベースの基本を学習すれば、他のデータベースへの移行もスムーズにできるのが特徴です。
MySQL
MySQLは、オープンソースのデータベースで無料で使うことができるため、世界中で多くの企業や個人が使っているデータベースです。
言わずとしれた世界No.1CMSであるWordPressでも使われているので、最も認知度が高いリレーショナルデータベースと言えるかもしれません。
Webサーバー(Apacheなど)を用意して、MySQLサーバーをインストールする必要がありますが、レンタルサーバーが自動でMySQLの環境を作ってくれるツールなどもあるので、比較的容易に利用することができるのも魅力の一つです。
SQL Alchemy
SQLAlchemyは、Pythonで最もよく利用されているORM(Object-relational mapping)です。
ORMは、Pythonからデータベースへ接続して、SQLを実行し、テーブルを作成したり、フィールドを追加したり、変更したり、削除したりできるツールです。
SQLAlchemyは、次のデータベースを扱うことができます。
- Microsoft SQL Server
- MySQL
- Oracle Database
- PostgreSQL
- SQLite
リレーショナルデータベースを扱うには、SQL文を使う必要がありますが、SQLAlchemyモジュールが用意している関数を使えばSELECT文やINSERT文などを自動で生成し、SQL文を組み立ててくれます。
また、データベースによって微妙な違いのあるSQL文もSQLAlchemyモジュールがそれぞれのデータベースに合わせてSQL文を生成してくれるので、データベースの移行も簡単にできる便利なORMモジュールです。
NoSQL
続いてNoSQLですが、リレーショナルデータベースがSQLによってテーブルの項目をつなげるのに対して、つなげる部分をカットしてJSON(JavaScript Object Notation)ドキュメントなどに保存されます。
JSONの例
{
name:"master",
age:45,
phone:["090-1234-5678", "03-1234-5678"],
businessAddress:
{Pref:"Tokyo",
City: “Minatoku”,
Zipcode:"105-0003"
}
homeAddress:
{
Pref:"Chiba",
City: “Urayasushi”,
Zipcode:"279-0031"
}
}
NoSQLは、高性能・高機能なデータベースが必要であるモバイルやWebサービス、ゲームなど、最新のアプリケーションに最適化されてたデータベースとして活用が広まっています。
そんなNoSQLデータベースのうち、次の4つのタイプのデータベースを学習する予定です。
- キーバリュー型
- ドキュメント型
- ワイドカラム型
- グラフ型
それぞれのタイプの特徴を簡潔に解説していきます。
キーバリュー型(Memcached)
Pythonの辞書型データと同じように、keyとvalueがあるキーバリュー型ですが、構造は単純で、キーとバリューがあり、データが追加されるたびに下方向にデータが追加されていきます。
複数のデータベースに分割可能になり、複数のサーバーにデータを分けて利用しやすいのが特徴です。
データベースのセクションで学習するMemocachedは、Webアプリケーション等において、アプリケーションサーバーを使う際にサーバーへの問い合わせ結果を一時的にキャッシュすることでレスポンスの遅延を防ぐ役割を持った分散キャッシュサーバーです。
データはメモリ上に保存されるので、OSを再起動したり、memochachedを再起動したりすれば、すべてのデータが消えてしまいます。
ドキュメント型(MongoDB)
ドキュメント型は、NoSQLの最初に紹介したJSON形式のドキュメントにデータを格納するデータベースで、代表的なものがMongoDBで、NoSQLの中では国内普及率No.1のデータベースとなります。
リレーショナルデータベースの【テーブル】【行】【列】が、MongoDBだとそれぞれ【コレクション】【ドキュメント】【フィールド】に当たります。
JSONは、xmlより簡単に階層構造のデータを扱える上、データが軽いため、PCとServerの通信でよく使われていて高速化できるため、JSONをデータベースとして扱えるMongoDBがWebアプリケーションやオンラインゲームでの利用シーンが増えてきているようです。。
ワイドカラム型(HBase)
ワイドカラム型は、キーバリュー型を拡張したデータベースで、一つの行に複数の列(カラム)を持つことができます。
代表的なものがHBaseで、読み込み機能よりも書き込み機能を強化して、MasterサーバとRegionサーバという2種類のサーバで構成されます。
データは、一定の行と列に分割されてファイルとしてRegionサーバに保存され、データがどのRegionサーバに保存されているかを記録しているのがMasterサーバです。
素人的には、データを切り分けて保存すること自体が処理を遅くさせてしまうのではないかと思ってしまいますが、データを切り分けるほうが無駄な読み込みなどをしないぶん、処理が速くなるようです。
グラフ型(Neo4j)
最後にグラフ型ですが、リレーショナルデータベースでは処理が不可能な複雑なデータ処理に特化したデータベースです。
グラフ型データベースの代表がNeo4jで、Neo4j社が開発した革新的で唯一無二のグラフデータベースです。
人と人の関係やモノの関係をマインドマップのような図にして表現するので、ひと目で相関図がわかります。
やってみないとわからない
Webでそれぞれのデータベースを調べながら紹介しましたが、実際に触ってみないことには全くもってよくわかりません。
MySQLはWordPressを使っているのである程度理解はできるものの、NoSQLに至っては、触ったことがないので、使い方のイメージが湧いてきません。
明日からは一つずつデータベースを触っていく予定ですが、これまた頭から煙が出てきそうな感じがしています。
今日もすでに頭の中がオーバーヒートしかけなので、このへんで終了して明日に備えたいと思います。
それでは明日もGood Python!