勉強メモーDB関連
データベースを構成する要素
・サービスで扱う概念(エンティティ)
・エンティティの属性
・エンティティ同士の関係性(リレーション)
概念(エンティティ)
→ユーザーやツイートなど
属性
→エンティティが個別にもつ情報
→投稿日、いいね数、投稿日時など
関係性(リレーション)
→エンティティとエンティティの間にある関係性
データベース設計の手順
1、データベースで管理するデータ(エンティティ)を決定
2、それぞれのデータの持つ属性を決める
3、エンティティ同士の関係性を決める
4、データベースのテーブルとして定義する
—————————————
テーブルのルール
・行(レコード)はエンティティの具体的なデータ
・列(カラム)はエンティティの属性
例
id |
name |
|
1 |
森田 |
test@gmail.com |
属性の中には特殊データがある
=>キー
=>同じテーブルのレコード同士を識別するためのデータ
=>例)id
=>キーは絶対被らないユニークなもの
主キー
他のレコードとの区別をつける識別子となるカラム
=>ユニークでなければならない
外部キー
異なるテーブルのレコードと関係性を持つ場合に必要なカラム
例)以下の場合は「student_id」が外部キーとなる
id |
name |
|
2 |
森田 |
test@gmail.com |
id |
score |
student_id |
1 |
森田 |
2 |
制約
特定のデータの保存を許さないためのバリデーション
例)同じメアド、空のまま登録不可
制約の種類/全部で4つ
・NOT NULL制約
・一意性制約
・主キー制約
・外部キー制約
NOT NULL制約
空登録を許さない制約
一意性制約
同じ値を登録できない制約
一意性=ユニークで他とは違う
主キー制約
=NOT NULL制約 + 一意性制約
主キー必須+重複不可を保証するための制約
Railsでは主キーはidカラムとして自動で作成される
外部キー制約
外部キーに対応するレコードが必ず存在することを保証する制約
インデックス
データベース機能の1つ
データ検索を高速化する
カラムに対して設定することができ、接待したカラムでの検索が高速になる
インデックスのデメリット
・データを保存/更新する速度が遅くなる
・データベースの容量を使う
1つに対して/複数カラムに対してインデックスできる
—————————————
正規化
データ構造をより効率的で重複や無駄の無いシンプルな構造にするための手順
非正規形→第一正規形→第二正規形→第三正規形
第一正規形
同一のカラムが存在しない かつ レコード1つに値が1つ入る
id |
store |
movie_title |
movie_mobilization |
1 |
渋谷 |
君の名は |
1,000 |
2 |
渋谷 |
ファンタスティック・ビースト |
1,500 |
3 |
新宿 |
1,200 |
|
4 |
新宿 |
イット |
500 |
5 |
渋谷 |
800 |
|
6 |
渋谷 |
1,300 |
第三正規形(第二は紛らわしいので割愛)
主キーでないもの同士の依存がない状態
★映画館の場所属性
id |
name |
1 |
渋谷 |
2 |
新宿 |
★動員+公開映画の属性
id |
number |
title |
store_id |
1 |
1,000 |
君の名は |
1 |
2 |
1,500 |
ファンタスティック・ビースト |
1 |
3 |
1,200 |
2 |
|
4 |
500 |
イット |
2 |
5 |
800 |
1 |
|
6 |
1,300 |
1 |
正規化のデメリット
手順を進めるほどパフォーマンスが低下する
→第三で終えることが多い
—————————————