日記を初めてから今までずーっと使っていながらも、あまり焦点を合わせていなかったなぁということで、今回はそんなデータベースに触れてみたいと思います。
自分で調べながら、他人に教える感じで進めていきまする。
データベースってなぬ?
一般的にデータベース(DB)って言われてるのは、だいたいRDBMSだと思います。
とは言うものの、たけけんもMySQLを使っていながらも、データベースってなに?ってことは説明が難しく感じます。
RDBMSはリレーショナルデータベースの管理システムってやつですが、DBって何?って聞いてきた人にDBはRDMBSだよって言っても は?ってなるので、簡単な説明をすると、たとえばエクセルは有名だと思うので、エクセルでこんな表(テーブル)を作ったとします。
よく作りますよね、こういうの。
ID | クラス | 名前 | 専攻科目 |
001 | A-1 | 松田耕作 | マスメディア |
002 | C-2 | 猪熊柔 | 柔道 |
たけけんも何年か前は仕事のデータの管理をエクセルのみ(実績データみたいなもんです)でやってましたが、データ量がその程度なら問題ないのですが、例にあげたような生徒の管理として、他に住所や電話番号とか色々な情報があったとして、それが例えば100万人くらいのデータだったとすると、膨大すぎてエクセルだと大変っすね。
エクセルというか、人間には大変です。
なので、上の表みたいにコンパクトにまとめて、ほかに住所や電話番号のテーブル、生年月日や所属のテーブルなどに分けます。
※データベース構造の話はちょっと難しいので、サンプルとして説明しています。
そしてリレーショナルデータベースなら、クラスだったり、所属といったものをキーとして、その主キーを元にデータを抽出したり、テーブルの結合やらなんやらかんやらと、膨大なデータを管理ができて、一般的にはUI(管理画面)と連携したりして色々できるのがデータベースです。
すげーエクセルだって説明しているサイトをどこかで見ましたが、マイクロソフトだとAccessが該当し、エクセルでもVBを使えば近いことができるそうです。
他にもOracle Database、MySQL、PostgreSQL、MongoDBとかあります。
例では、顧客管理のようなテーブルになってますが、今使っているWordpressとかZabbixもデータベースを利用したプログラムです。
基本の基本
じゃあWordpressを題材にして、中身を覗いてみますん。
データベースの初期教育ってだいたい顧客管理だと思うんで、ブログのテーブルってちょっとピンと来ないかもしれないので、どんなのか見てみよう。
例はMySQLです。まずはログインしてテーブルを見てみます。
[root@vincentina]# mysql -u wordpress -p wordpress Enter password: Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A
mysql> show tables; +--------------------------+ | Tables_in_wpdata | +--------------------------+ | wp_Counterize | | wp_Counterize_Keywords | | wp_Counterize_Pages | | wp_Counterize_Referers | | wp_Counterize_UserAgents | | wp_commentmeta | | wp_comments | | wp_links | | wp_options | | wp_postmeta | | wp_posts | | wp_term_relationships | | wp_term_taxonomy | | wp_usermeta | | wp_users | +--------------------------+ 21 rows in set (0.00 sec)
まんがいち脆弱性があるプラグインがあったらいやなので、何個か消してますがw
一覧を出すとこんなけのテーブルが表示されます。
テーブルレイアウトを見るときは
DESC [テーブル名];
とします。
mysql> desc wp_Counterize_UserAgents; +----------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------------+--------------+------+-----+---------+----------------+ | agentID | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(255) | NO | MUL | NULL | | | count | int(11) | NO | MUL | 1 | | | browserName | varchar(255) | NO | | NULL | | | browserCode | varchar(255) | NO | | NULL | | | browserVersion | varchar(255) | NO | | NULL | | | browserURL | varchar(255) | NO | | NULL | | | osName | varchar(255) | NO | | NULL | | | osCode | varchar(255) | NO | | NULL | | | osVersion | varchar(255) | NO | | NULL | | | osURL | varchar(255) | NO | | NULL | | +----------------+--------------+------+-----+---------+----------------+ 11 rows in set (0.01 sec)
さっきの例でいうと、テーブルレイアウトはID、クラス、名前、専攻だったね。
WordPressの記事はどこにあるのか?
参考サイト
WordPressのデータベース構造
ここを見るに、wp_postsテーブルにあるようです。
mysql> desc wp_posts; +-----------------------+---------------------+------+-----+---------------------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------------------+---------------------+------+-----+---------------------+----------------+ | ID | bigint(20) unsigned | NO | PRI | NULL | auto_increment | | post_author | bigint(20) unsigned | NO | MUL | 0 | | | post_date | datetime | NO | | 0000-00-00 00:00:00 | | | post_date_gmt | datetime | NO | | 0000-00-00 00:00:00 | | | post_content | longtext | NO | | NULL | | | post_title | text | NO | | NULL | | | post_excerpt | text | NO | | NULL | | | post_status | varchar(20) | NO | | publish | | | comment_status | varchar(20) | NO | | open | | | ping_status | varchar(20) | NO | | open | | | post_password | varchar(20) | NO | | | | | post_name | varchar(200) | NO | MUL | | | | to_ping | text | NO | | NULL | | | pinged | text | NO | | NULL | | | post_modified | datetime | NO | | 0000-00-00 00:00:00 | | | post_modified_gmt | datetime | NO | | 0000-00-00 00:00:00 | | | post_content_filtered | longtext | NO | | NULL | | | post_parent | bigint(20) unsigned | NO | MUL | 0 | | | guid | varchar(255) | NO | | | | | menu_order | int(11) | NO | | 0 | | | post_type | varchar(20) | NO | MUL | post | | | post_mime_type | varchar(100) | NO | | | | | comment_count | bigint(20) | NO | | 0 | | +-----------------------+---------------------+------+-----+---------------------+----------------+ 23 rows in set (0.00 sec)
このpost_contentというフィールドになるようです。
他にも記事が公開か非公開か、投稿した日時とか、色々な項目からなりたっています。
ここで本文をずらずらっと出すわけにはいかないので、guidというWordpressのURLになるフィールドに着目してみようと思います。
wp_postsテーブルからguidを選択し、idを基準として順番に並べて、大きいもの(desc)から5番目までを表示というSQLです。
mysql> select guid from wp_posts order by id desc LIMIT 5; +-----------------------------------+ | guid | +-----------------------------------+ | http://www.vincentina.net/?p=4418 | | http://www.vincentina.net/?p=4417 | | http://www.vincentina.net/?p=4416 | | http://www.vincentina.net/?p=4415 | | http://www.vincentina.net/?p=4414 | +-----------------------------------+ 5 rows in set (0.00 sec)
ここではやりませんが、テーブルの操作は
INSERT/UPDATE/DELETE
などの命令があります。
さっきまでやってたのはselect文ですね。
もしかしたら学校の授業などで見たことがあるかもしれません。
WordPressの管理画面からマウスでぽちぽちやってると、サーバーへ命令が飛んでものすごい処理をしているのです。
だんだんデータベースのイメージ像もできてきたかなぁと思いますがどうでしょうか。
Wordpress、Zabbix、Redmine、その他もろもろ。
もう、随分と前からとは思うけど、色んな分野でデータベースの知識が必須になってきているようです。
PHPのアプリケーションを使うだけなら簡単ですよね。
簡単だけにデータベースについては意識レベルが低いように感じます。よって、セキュリティ面で穴が出来てしまう可能性が高いんじゃないなかとちょっと思いました。
管理者にしても、MySQLのチューニングなんかもググれば出てきて、問題点と照らし合わせてコピペすれば何とかなる世の中だけに、なかなかデータベースじたいに触れる機会もすくない訳で、昔に読んでたDBの本を最初からじっくり読むには、いい機会かもしれませんな。