データベースとは何か?
一言でいえばデータを保存しておく箱のことです。データベースという名前そのものが既にそれを示していますね。
例えば楽天やAmazonなどのショッピングサイトでは各商品のデータがデータベースに保存されており、必要に応じて呼び出されて表示されているわけです。
ツイッターで言えばつぶやきやユーザー情報がデータベースに登録され紐づけされており、ログインしたユーザーやフォローしているユーザーのつぶやきがタイムラインで表示されます。
インスタグラムでは画像そのものがデータベースに入っているわけではないと思いますが、何かしらの画像IDをキーに画像を判定し読み込み表示していると思います。
データベースが必要なのはインプットとアウトプットがあるサイト
上記の例でいえば
- 楽天やAmazonでは商品情報が入力され、お客様向けに表示される=インプット・アウトプット
- つぶやきが入力され、タイムラインに表示される=インプット・アウトプット
ということになります。
なので特にインプット・アウトプットのないサイトを作る際にはデータベースは必要ありません。昨今のwebサービスでそのようなことはあまりないとは思います。
ユーザー登録もインプットなので、ユーザー登録・ログインがある時点で既にデータベースの利用は必須だと覚悟しておいた方が良いです。
データベースの勉強方法
データベースを利用するにあたり勉強しなくてはいけないのは大きく以下の2点かと思います。
- データベース設計
- SQLの利用
データベース設計
目的に合わせてどのようなテーブルを作る必要があるかを考える必要があります。難しいような気がしますが、エクセルで表を作るのと同じようなものです。
例えばユーザーがつぶやきを投稿するようなサイトならまずユーザーテーブルが必須になります。次につぶやきテーブルですね。
- ユーザーテーブル
- つぶやきテーブル
作成するテーブルが決まったらテーブルが決まったら次に中身の項目(カラムと呼ばれます)を考えます。
試しにユーザーテーブルで考えるとこんなところでしょうか。
- ユーザーID
- ニックネーム
- メールアドレス
- パスワード
つぶやきテーブルも考えてみます。
- つぶやきID
- ユーザーID
- つぶやき内容
ここでつぶやきテーブルの項目に「ユーザーID」が入っているのがポイントになります。
誰のつぶやきなのかを記録しておくことにより、そのユーザーがログインした時にそのユーザーIDのつぶやきを引っ張ってきて表示するわけです。
こういったテーブル同士の関係をリレーションと呼びます。
命名に悩む
データベースのテーブル、そしてテーブル内のカラムの設計が終わったとして、次に悩むのが命名かと思います。
つけようと思えば日本語の名前そのままに使うこともできなくはないのですが、プログラムにおいて日本語を扱うことは相当鬼門です。後々ほぼ確実に問題を引き起こします。
なので英語で付ける場合がほとんどです。
ユーザーテーブルならテーブル名をuserに、各カラムを英語に直すとこんなところでしょうか。
- user_id
- nickname
- password
今回は英語にしやすいワードばかりなので楽ですが、これ英語でなんていうんだろうなぁというワードも多いので悩みます。
仮に英語でそう言うのであっても、パッと見て日本語それを表しているということがわかりづらい単語もあるんですよね。
その度にまず翻訳しなければいけないくらい難解な英語名をつけるのかどうかも悩みどころです。
SQLの利用
どのようなデータベースにするかを設計し終わったら、あとはそのテーブルにデータを入れていって、必要に応じて取得して表示するだけなのですが、その際に必要なのがSQLです。
簡単に言ってしまえば
- INSERT文でデータを入れる
- UPDATE文でデータを更新する
- SELECT文でデータを取得する
- DELETE文でデータを削除する
の4つです。これについては以下の記事で詳しく書いていますので参考にしてみてください。
データベースの注意点
データベースを利用する際に注意しなければいけないことがあります。それはデータベースにアクセスが集中するとサーバーの負荷も高まるということです。
最悪メモリを使い果たしてサーバーが落ちるなども良くあります。なので何でもかんでもデータベースを使わない方が良い場合もあります。
またシンプルなSQLを利用するように注意するのも有効です。複雑なSQLにすると負荷が高まります。
このあたりは実際にサイトを公開してみてアクセスが集まってみないと何とも言えませんが、始めから注しておくのは有効です。
データ件数が多い場合は要注意
シンプルに負荷が高いのはデータの量が多いテーブルを扱う場合です。例えば何百万行、何千万行のデータがあるテーブルなどは扱いに注意が必要になります。
あまり個人レベルでその量のデータを扱うことはないかもしれませんが、もし多いものを扱う場合は注意が必要です。
個人でレンタルするようなレンタルサーバーでは負荷が高すぎるものを利用していると停止されたりしかねないですしね。
データベースはもちろん利用するんですが、なんでもかんでもデータベースに頼らないという視点も必要になります。
高負荷の回避方法
これは勉強の初期段階では軽く頭に入れておく程度で良い情報なのですが、負荷が高い場合データベースをマスタとスレーブの二つにわけるという方法があります。
マスタの方はデータを入れたり更新したりといったデータへの操作が行われます。一方スレーブに対して行われるのは読み込みのみ。
このように分離することによってアクセス過多による負荷を分散する方法があるということをちらりと把握しておくと後々役立つと思います。
もしくは毎回リアルタイムにデータベースにアクセスせず、キャッシュを作成して一定時間はそちらを参照するといった方法もあるかと思います。
セキュリティの問題
もう一つ、SQLにはSQLインジェクションという攻撃をされる可能性があります。これを悪用されると不正ログインされたりデータ漏洩したりする危険性があります。
回避方法はSQLを適切にエスケープすることなのですが、手っ取り早いのはフレームワークを利用した開発を行うことです。
例えばPHPなら今はLaravelが旬かと思いますが、Laravelのデータベース利用方法に添えば必然的にSQLのエスケープは行われます。
個人的には最初は自分の開発マシンで穴のあるサイトを作ってそこに実際に攻撃を仕掛けて本当に被害が出るという経験も積んでおくと良いと思います。
webサイトを作成する際には色々セキュリティ的に注意する部分がありますが、そちらは以下の記事を参考にしてください。
まとめ
webサービスを作ろうと思ったらデータベースはほぼ必須となってきます。是非、有効活用して面白いwebサービスを作ってみてください。
ただし負荷やセキュリティなど注意する点もありますのでお忘れなく。