Taglibro de miyacorata

Vi fine falos en la marĉon.

草を生やしてP生活を向上させる話 PHP+DB編

12月も中盤になり朝晩クッソ寒くて冬眠したくなる季節、皆様いかがお過ごしでしょうか。宮野です。

この記事は「Except imas (エクマス) Advent Calendar 2019」の12月12日の記事として書かれています。約分したら元日です。わぁい。

[blogcard url="https://adventar.org/calendars/4541"]

昨日の記事はゆがぽくんの「CTFについて語りたい」でした。

[blogcard url="https://ygp.hateblo.jp/entry/2019/12/11/111824"]

CTF(Capture The Flag)、要はサイバー世界の謎解きゲームみたいなやつですね。Raiseはしません。はい。

何年前かチーム友利奈緒が出場しさらに文部科学大臣賞を受賞したことで話題になったSECCONという大会がありましたがあれもCTFの一つです。あれはほんとにサイバー陣取りゲームでかなり深い知識を要求されます。すごいね。

本題に入る前に

この記事は一部アイマスが含まれるというか起点がアイマスですが概ねPHPとWebフロントエンド中心の記事になりますので何卒ご容赦ください。あんまり長いので分けます。すいません。

アイマスがカバー範囲広すぎるのでマジでアイマスが絡まない趣味というか好きなものがないんです許してくださいなんでもするすす。

なお今回はプログラミングやったことない人向け?な話が続きますのでわかるひとは適宜飛ばすなりマサカリ飛ばすなりしていただければと思います。よろしくお付き合いください。

草を生やすとは

GitHubに進捗を投げたときに発生する緑のブロックコントリビューショングラフ(Contribution Graph)と言いますが、どう見ても芝生です。このことから転じて進捗をあげればあげるほど緑のブロックが濃くなり芝生に近づくことから進捗を生やすことを草を生やすとか呼ばれます。

下のほうの緑のブロックがわーってあるのがContribution Graph

PHPとはなにか

PHP: Hypertext Preprocessorとは、スクリプト言語、まぁプログラミング言語の一つです。とりわけWeb系の開発に適しており、たとえばWikipediaも使用しているウィキソフトウェアであるMediaWikiや、このブログのCMSであるWordPress、またアイドルマスターの公式ポータルサイトPHPで書かれていることがわかっています。公式のイントロダクションを以下に示しますのでぜひご一読ください。

[blogcard url="https://www.php.net/manual/ja/intro-whatis.php"]

PHPスクリプト言語ですが、様々なデータベース管理システム(DBMSと略されます)をサポートしています。さらに、Webサイトへのアクセスに使われるHTTPのほか、メールの送受信に使われるIMAPSMTPなど様々なプロトコルもサポートしています。PHPはWeb開発によく用いられますが、それ以外にも対応できる万能な言語の一つです。

関係データベースとはなにか

Excelです と書いてしまうと強い方々から怒られが発生するのでちゃんと書きます。
今回は関係データベースについて書きますがこれに当てはまらないデータベース管理システムも存在しますので念の為。

データベースとはデータを蓄積し、またそれを検索しやすくしたものを指しますが、とりわけ関係データベースとは、関係モデルに基づいて設計されたデータベースを指します。

関係とはなにか

じゃあ関係ってなんなんだとなるんですが、まぁWikipediaとか見て頭ひねるより実際のアレを見たほうが良いかなと思います。

データは表、まぁExcelのテーブルに似た雰囲気で管理されるわけですが、これは関係と呼ばれる概念でモデル化されます。関係モデルは組あるいはタプル(Excelで言う行)、属性あるいはカラム(Excelで言う列)、定義域(データ型とほぼ同義)、あとは主キー、候補キー、外部キーなどの要素で構成され、これらの関係に対しSQLなどのデータベース操作言語を用いて様々な演算を行い、結果を得ます。

クッソむつかしいなんかが出てきましたが、これをアイマスで無理やり例えてみましょう。

例えば、アイドルのデータ群と楽曲のデータ群があります。それぞれのデータ群をテーブルと呼びましょう。(データは例示のためのもので他意はありません またカラム数をだいぶ簡略化しています)

所属ID名前読み年齢出身地
1天海春香アマミハルカ17神奈川県
2如月千早キサラギチハヤ16東京都
3星井美希ホシイミキ15神奈川県
4春日未来カスガミライ14東京都
5最上静香モガミシズカ14埼玉県
6伊吹翼イブキツバサ14東京都

楽曲ID曲名読み歌手1歌手2歌手3
1START!!スタート1
2マリオネットの心マリオネットノココロ3
3青い鳥アオイトリ2
4CRIMSON LOVERSクリムゾンラバーズ12
5未来飛行ライヒコウ4
6Catch my dreamキャッチマイドリーム5
7恋のLesson初級編コイノレッスンショキュウヘン6
8ハルカナミライハルカナミライ14
9君との明日を願うからキミトノアスヲネガウカラ456

下の方、楽曲情報のテーブルの歌手nカラムに整数のみが入っていることにお気づきいただけることでしょう。このとき、歌手nと所属IDを結びつけることでアイドルの名前からどの曲を歌っているか調べたり、この曲を歌っているのはどんなアイドルか、などの情報を得ることができるようになります。

関係モデルで言うと、アイドルテーブルの所属IDはこのテーブルの中でアイドルを一意に特定する手がかりになる候補キーの一つで、テーブルの中でアイドルを一意に特定する主キーです。また、このとき楽曲テーブルの中で歌手nカラムはアイドルの所属IDを参照する外部キーとなります。

注釈: 候補キーは、タプル(行、アイドルテーブルでいうアイドル)を一意に特定する手がかりになるカラムのうち最小のものを指します。 例えば「東京出身の14歳」とすると未来ちゃとつばってぃがかぶってしまい一意に特定できなくなりますが、「東京出身の春日未来さん」、つまり出身地と名前による複合キーとすると誰のことか一意に特定できるようになります。このとき出身地のカラムと名前は候補キーであるということができます。主キーの候補となりうるため候補キーと呼ばれます。
このテーブルでは所属IDにユニークな整数を振ってアイドルを管理しています。所属IDさえわかればアイドルを特定できる、カラム1つでいい候補キーです。そのためこのテーブルでは所属IDを主キーとしています。

こうすると何が嬉しいかと言うとそれぞれのテーブルは分かれていますので誕生日で年を取りました~(取らないけどね)ってときに変更するのはアイドルの年齢カラムだけ(実際には生年月日を入れてこんぴーたで計算するのが賢いんですがそうとも限らないのがアイマス())、曲名の読みが間違ってました~(なんでこっちのほうがありうるんだろうなぁ)ってときに変更するのは楽曲の読みカラムだけなんですね。あるテーブルに変更が発生しても他のテーブルには(よほどのことがないかぎり)影響を及ぼしません。

各データは名前などの文字情報であれば文字列、年齢などの数値情報であれば数値、日付であれば日付型といった感じに定義域(≒データ型)を指定できるのでデータとしても扱いやすいです。たとえば列挙型(Enum)というデータ型を使えば"Princess"と"Fairy"と"Angel"と"Ex"の4つの値を定義域とすることができ、お察しの通り属性や血液型などとりうる値が限られているものをこうすることができます。これにのちのち苦しめられたりするのですがそれはもう少し後のお話。

そんな感じで関係データベースはデータを取り扱ううえでとてもおいしい働きをしてくれるのです。おいしいから大丈夫だよ。そうじゃない。

欲しいデータを取り出す

実際にデータを取り出したりするに当たり、SQLなどのデータベース操作言語(プログラミング言語ではないよ)を用います。

データベースは先述の通りデータの集まりですので、欲しいデータを得るためには「あーだこーだそれこれなデータを出してくれ」とデータベース管理システムに問い合わせる必要があります。

例えば上のテーブルが存在するとしてアイドル全員の情報を知りたい場合、次のようなSQLでアイドル全員の情報を得ることができます。

SELECT * FROM アイドル;

「春日未来さんのプロフィールを知りたい」場合次のようになります。

SELECT * FROM アイドル WHERE 名前 LIKE 春日未来;

注釈:このSQLは正確には「名前が"春日未来"のアイドル」を指定しているにすぎないため、春日未来さんが複数人いた場合は複数の春日未来さんの情報が返ります。

これはSELECT文というデータを取り出すときに使う文(ステートメント)の一つです。SELECT文にはSELECT句、FROM句、WHERE句、ORDER BY句などで構成されます。(あといくつかあります)

SELECT句は必要なカラムを指定します。*(アスタリスク)を記載した場合はすべてのカラムを取得します。取得するカラムを明示する場合はカンマ区切りで記載し、多くの場合カラム名は`(バッククオート)で囲みます。関係演算では射影と呼ばれる操作です。 また関数を用いて数値を持つ列に対して丸めや四捨五入、結果全体に対して合計や相加平均、最大・最小値、標準偏差などを求めることもできます。

FROM句はデータ群、つまりデータを取り出すテーブルを指定する句です。テーブルはそのまま指定することはもちろん、結合という操作をすることができ、例えば楽曲テーブルとアイドルテーブルの所属IDを対応付けて楽曲一覧に歌っているアイドルのプロフィールをくっつけるような操作が可能になります。このような場合は等価なカラムを手がかりにするため特に等価結合と呼ばれます。その他に名前が同じカラムがあればそれらを元にした結合を行う自然結合、直積(デカルト積)を生成するクロス結合などがあります。

WHERE句は取り出すデータの条件を指定する句です。等価なものを探すだけでなく、数値については非等価演算子を用いた範囲検索、文字列についてはワイルドカードを用いた検索もできます。WHERE句の中でさらにSELECT文を各副問合せ(サブクエリ)をぶち込むこともでき、たとえば以下のSQLでは所属IDを知らない場合でも「"春日未来"さんが歌っている曲」を探すことができます。

SELECT *
FROM 楽曲
WHERE 歌手1 = (SELECT 所属ID FROM アイドル WHERE 名前 LIKE '春日未来' LIMIT 1);

楽曲を取り出すSELECT文の中でさらにアイドルの所属IDを取り出すSELECT文をサブクエリでぶち込むことで名前を所属IDにした上で楽曲を引き出すことができるわけです。

ここまで書いたものらでデータベースから情報を取り出すんですが、もっとやりたい操作があります。そう、ソートですね?SQLではORDER BY句で結果に対してソートを行うことができます。

例えば次のようなSQLで年齢昇順(育ちゃんからこのみさん方向)でソートした結果を得ることができます。

SELECT * FROM アイドル ORDER BY 年齢 ASC;

今回はSELECT、データを取り出す文しか扱っていませんがデータベースはCRUD全部できます。CRUDするのはそれぞれINSERT文、SELECT文、UPDATE文、DELETE文があります。SQLにはこの4つ(データ操作言語に属します)のほか、データベースの作成・変更・削除を司るデータ定義言語としての文、アクセスできるユーザの管理を司るデータ制御言語としての文も含まれますので興味を持たれた方は調べてみてくださいね。

そんなわけで

データベースでこんなことできるよって話を一通りしたところで実践編と参りましょう。

これを作ります ようやくPHPとかの実装方面の話をやります

次回!草を生やしてP生活を向上させる話 Laravel+Webフロントエンド編 12月16日更新予定!

マジで長くなってしかも1話完結しなくてほんとすいませんでした(土下寝する絵文字)

明日のエクマスはもとかどけさんの「Excelで作ってる本の話」です。お楽しみに!