データベース設計の基礎
ソフトウェア開発の考え方
DOA(Data Oriented Approach)
データ中心アプローチという考え方です。
プログラムよりも前にデータ設計からはじめる。方法論が近年主流となっている。
データベースを構成する要素
構成要素は以下の3つ
- エンティティ
- エンティティの属性
- リレーション
データベース設計の手順
- データベースで管理するデータ(エンティティ)を決める(テーブル)
- データの属性を決める(カラム)
- 関連性を決める(アソシエーション)
- テーブルを定義する
各構成についての説明
エンティティ
サービスで扱うデータのことを言います。テーブルに当たります。
例えば、SNSなどのサービスでは「ユーザー」や「投稿内容」、「コメント」などの情報を管理する必要がありますが、これらの情報がエンティティになります。
エンティティ属性
エンティティはそれぞれ個別に属性(情報)を持っています。
例えば、個人の「ユーザー」が持っているものだと、「名前」、「写真」、「アドレス」、「パスワード」などです。
「投稿内容」が持っている物は、「投稿したテキスト」、「投稿した写真」、「いいねの数」などです。
リレーション
リレーションはエンティティとエンティティの間に関連性がある場合のことを言います。
Railsでは、アソシエーションという技術を使うことでこの関連性を作り、データのやりとりをスムーズに行うようにすることができます。
SQLとは
設計の仕方の次は、テーブルからデータを取り出したり、テーブルに保存したりする言語のことについてです。
SQL(Structured Query Language)はリレーショナルデータベースの操作をする言語のことです。ちなみにSQLはISO(国際標準化機構)で規格化されている為、文法はほとんど変わりません。
SQLが行う命令には大きく2つの種類があります。
データを定義するDDL(Data Definition Language)
命令 | 機能 |
---|---|
CREATE | データベースやテーブルの作成 |
ALTER | データベースやテーブルの更新 |
DROP | データベースやテーブルの削除 |
データを操作するDML(Data Mnipulation Language)
命令 | 機能 |
---|---|
INSERT | データの登録 |
UPDATE | データの更新 |
DELETE | データの削除 |
SELECT | データの検索 |
データベース構造の操作コマンド一覧
これらのコマンドはご自身の開発環境の「ターミナル」を使用してください。
はじめにやること
#mysqlの起動
$sudo service mysqld start
#mysqlに接続
$mysql -u root
#下のように表示され待機状態になればok
mysql>
操作コマンド一覧
役割 | コマンド |
データベース一覧表示 | show databases; |
データベースの作成 | create database データベース名; |
作業するデータベースを選択 | use データベース名; |
テーブル一覧を表示 | show tables; (useコマンドでデータベースを選択しておく必要がある) |
テーブル作成 (カラムは複数追加できる) |
create table テーブル名(カラム名、カラム型、…); |
テーブル構造を確認 | show columns from テーブル名; |
カラムを追加 | alter table テーブル名 add カラム名 カラム型; |
カラムを追加(複数) | alter table テーブル名 add(カラム名 カラム型 , カラム名 カラム型, …); |
カラムの変更 | alter table テーブル名 change 古いカラム名 新しいカラム名 新しいカラム型; |
カラムの削除 | alter table テーブル名 drop カラム名; |
データベースに保存するデータの操作コマンド一覧
役割 | コマンド |
データを登録 (全てのカラムへ) |
insert into テーブル名 values (値1, 値2, …); |
データを登録 |
insert into テーブル名(カラム名, カラム名) values(値1, 値2); |
データを更新 | update テーブル名 set 変更する内容 where 条件; |
データを削除 | delete from テーブル名 where 条件; |
基本的な検索構文
select * from テーブル名
from句
fromの後にテーブル名を付けることでテーブルの指定をします。
select句
selectの後にカラム名を付けることでカラムの指定をします。
ワイルドカード
上記のコードにある「*(アスタリスク)」は文字の代わりに使用できる記号で”全てのカラムを指定”を意味しています。
検索条件の指定方法
where句
条件を指定してその条件が成立するものを取得します。
select * from テーブル名 where 条件;
#使い方例(usersテーブルからfamily_nameカラム内の文字列(伊藤)を取得)
select * from users where family_name = "伊藤"
論理演算子を使うことでより細かい設定ができます。
#論理演算子を使った例
①and演算子
select * from users where age <= 22 and prefecture = "神奈川県"
②or演算子
select * from users where age <= 22 or prefecture = "神奈川県"
③not演算子
select * from users where not prefecture = "神奈川県"
その他の検索条件指定
between演算子
一つのカラム内で範囲検索をするのに使用する。
select * from テーブル名 where カラム名 between 下限 and 上限
#使い方例(ageカラムから21以上24以下の取得)
select * from users where age between 21 and 24
in演算子
1つのカラム内でリストを検索する。
select * from テーブル名 where カラム名 in(値1,値2,...)
#使い方例(東京と神奈川だけ取得する)
select * from users where prefecture in("東京", "神奈川")
検索したデータを形成する
データの結合
例えば、ユーザーのフルネームを取得したい場合、family_nameとfirst_nameを結合して取得することができます。
concat関数
select concat(カラム名, カラム名) from テーブル名
#使い方例
select concat(family_name, first_name) from users
注意点は、nullがあった場合は、結果がnullになってしまう。
カラム名が「concat(family_name, first_name)」となる。
as句
カラムに別名を付けることができます。
select 取得するデータ as 別名 from テーブル名
#使い方例
select concat(family_name, first_name) as "フルネーム" from users
重複するデータを除外
distinctキーワード
検索したカラムの値が重複していた場合除外してデータを取得する
select distinct カラム名 from テーブル名 where 条件
#使い方例
select distinct user_id from shifts where date = "2015-07-01"
レコードのグループ化
指定したカラムが同じ値を持つデータを1つのグループとしてまとめることができる。
利点
- グループ化された中に何件あるかデータで取得ができる。
- テーブルを結合させて、目的の情報だけを取得できる。
- 検索結果を用いて検索ができる。
group by句
指定したカラムが同じデータを持つデータを1つのグループとしてまとめることができる。
select カラム名
from テーブル名
where 条件
group by カラム名
#使い方例
select user_id
from shifts
where date = "2020-07-01"
group by user_id
グループ化された中の件数を取得
count関数
何件のレコードがグループ化されているかというデータを取得できる関数。
select カラム名, count(*)"数"
from テーブル名
where 条件
group by カラム名
#使い方例
select user_id, count(*)"数"
from shifts
where date = "2020-07-01"
group by user_id
テーブルを結合させ目的のデータを取得する
join句
指定したテーブルのカラム値が一致するデータを結合することができる。
select カラム名, count(*)"数", u.*
from テーブル名1
join テーブル名2 on テーブル名1.カラム名1 = テーブル名2.カラム名2
where 条件
group by カラム名
#使い方例
select user_id,
count(*)"数", u.*
from shifts s
join users u on s.user_id = u.id
where date = "2015-07-01"
group by user_id
検索結果を用いた検索
サブクエリ
ある検索結果を使用して別のSQL文を実行する仕組みのこと。
select *
from テーブル名
where カラム名 not in (リスト)
#使い方例
SELECT *
FROM users
WHERE id NOT IN (
SELECT DISTINCT user_id
FROM shifts
WHERE date = "2015-07-01"
)
以上で終わります。