1. 属性(アトリビュート)を洗い出す
2. データの関係を明確にする
a. 1:1なのか1:NのかN:Nなのか
b. 参照方向の確定(依存の親子関係)
3. エンティティのライフサイクルで分ける
4. ユースケースごとにデータの流れを整理する
5. 属性のnull、updateを無くすところまで分解する
a. イミュータブルモデリング
b. SELECTとINSERTのみでデータを表現する
エンティティの分解するとき
Slide 76
Slide 76 text
1. 属性(アトリビュート)を洗い出す
2. データの関係を明確にする
a. 1:1なのか1:NのかN:Nなのか
b. 参照方向の確定(依存の親子関係)
3. エンティティのライフサイクルで分ける
4. ユースケースごとにデータの流れを整理する
5. 属性のnull、updateを無くすところまで分解する
a. イミュータブルモデリング
b. SELECTとINSERTのみでデータを表現する
エンティティの分解するとき
1. 属性(アトリビュート)を洗い出す
2. データの関係を明確にする
a. 1:1なのか1:NのかN:Nなのか
b. 参照方向の確定(依存の親子関係)
3. エンティティのライフサイクルで分ける
4. ユースケースごとにデータの流れを整理する
5. 属性のnull、updateを無くすところまで分解する
a. イミュータブルモデリング
b. SELECTとINSERTのみでデータを表現する
エンティティの分解するとき
Slide 83
Slide 83 text
1. 属性(アトリビュート)を洗い出す
2. データの関係を明確にする
a. 1:1なのか1:NのかN:Nなのか
b. 参照方向の確定(依存の親子関係)
3. エンティティのライフサイクルで分ける
4. ユースケースごとにデータの流れを整理する
5. 属性のnull、updateを無くすところまで分解する
a. イミュータブルモデリング
b. SELECTとINSERTのみでデータを表現する
エンティティの分解するとき
ER図で表現する
Slide 84
Slide 84 text
関係を明確にする
Slide 85
Slide 85 text
1. 属性(アトリビュート)を洗い出す
2. データの関係を明確にする
a. 1:1なのか1:NのかN:Nなのか
b. 参照方向の確定(依存の親子関係)
3. エンティティのライフサイクルで分ける
4. ユースケースごとにデータの流れを整理する
5. 属性のnull、updateを無くすところまで分解する
a. イミュータブルモデリング
b. SELECTとINSERTのみでデータを表現する
エンティティの分解するとき
Slide 86
Slide 86 text
Userテーブルの分割の場合
Userテーブルの分割
Slide 87
Slide 87 text
create table users(
id bigserial
constraint users_pk
primary key,
name text not null,
birthday date not null,
email text not null,
hashed_password text not null
);
create unique index
users_email_uindex on users (email);
Slide 88
Slide 88 text
よく見るテーブルだけど?
Userテーブルの分割
Slide 89
Slide 89 text
???「LINE認証を追加したいんだけど」
Userテーブルの分割
Slide 90
Slide 90 text
???「LINE認証を追加したいんだけど」
↓
カラム追加すればえぇやろ!
Userテーブルの分割
Slide 91
Slide 91 text
alter table users
add line_id text;
alter table users
add line_token text;
create unique index
users_line_token_uindex
on users (line_token);
create unique index
users_line_id_uindex
on users (line_id);
1. 属性(アトリビュート)を洗い出す
2. データの関係を明確にする
a. 1:1なのか1:NのかN:Nなのか
b. 参照方向の確定(依存の親子関係)
3. エンティティのライフサイクルで分ける
4. ユースケースごとにデータの流れを整理する
5. 属性のnull、updateを無くすところまで分解する
a. イミュータブルモデリング
b. SELECTとINSERTのみでデータを表現する
エンティティの分解するとき
Slide 99
Slide 99 text
Small is beautiful.
小さいものは美しい
Unixの哲学
Slide 100
Slide 100 text
Small is beautiful.
小さなプログラムという発想
1. 小さなプログラムはわかりやすい
2. 小さなプログラムは保守しやすい
3. 小さなプログラムはシステム
リソースに優しい
4. 小さなプログラムは他のツールと組
み合わせやすい
https://amzn.to/33QPAdv
Slide 101
Slide 101 text
Make each program do one thing well.
1つのプログラムには
1つのことをうまくやらせる
Unixの哲学
Slide 102
Slide 102 text
Make each program
do one thing well.
一つのことに集中することで
プログラムに不要な部分をなくせる。
不要な部分があると、
実行速度が遅くなり、
不必要に複雑になり、
融通が効かない。
https://amzn.to/33QPAdv
Slide 103
Slide 103 text
1テーブル、1責務
正規化とSimple is Beautiful
Slide 104
Slide 104 text
1テーブル、1責務
↓
Simpleを目指す
正規化とSimple is Beautiful
Slide 105
Slide 105 text
SimpleとEasyは違う
正規化とSimple is Beautiful
Slide 106
Slide 106 text
正規化とSimple is Beautiful
Slide 107
Slide 107 text
正規化とSimple is Beautiful
Slide 108
Slide 108 text
イミュータブルに設計する
正規化とSimple is Beautiful
https://scrapbox.io/kawasima/%E3%82%A4%E3%83%9F%E3%83%A5%E3%83%BC%E3%82%BF%E3%83%96%E3%83%AB%E3%83%87%E3%83%BC%E3%82%BF%E3%83%A2%E3%83%87%E3%83%AB
[イミュータブルデータモデリング kawasima] [検索]
Slide 109
Slide 109 text
テーブルはSimpleが美しい
正規化とSimple is Beautiful
Slide 110
Slide 110 text
テーブルはSimpleが美しい
↓
EasyではなくSimpleを目指す
正規化とSimple is Beautiful
1. 論理データモデルを対象のソフトウェアに反映する
a. RDBMSの場合にはDDL
b. 検索のためのインデックスや制約を追加する
2. パフォーマンスの要件のために必要な対応
a. パーテーション
b. キャッシュ
3. 実際に利用するときのSQLを整理する
a. 参照のためのSELECTや更新の処理
b. そのときの実行計画を確認する
c. 10年後も同じ実行計画になるか
物理データモデリングの進め方
Slide 119
Slide 119 text
1. 論理データモデルを対象のソフトウェアに反映する
a. RDBMSの場合にはDDL
b. 検索のためのインデックスや制約を追加する
2. パフォーマンスの要件のために必要な対応
a. パーテーション
b. キャッシュ
3. 実際に利用するときのSQLを整理する
a. 参照のためのSELECTや更新の処理
b. そのときの実行計画を確認する
c. 10年後も同じ実行計画になるか
物理データモデリングの進め方
Slide 120
Slide 120 text
1. 論理データモデルを対象のソフトウェアに反映する
a. RDBMSの場合にはDDL
b. 検索のためのインデックスや制約を追加する
2. パフォーマンスの要件のために必要な対応
a. パーテーション
b. キャッシュ …など
3. 実際に利用するときのSQLを整理する
a. 参照のためのSELECTや更新の処理
b. そのときの実行計画を確認する
c. 10年後も同じ実行計画になるか
物理データモデリングの進め方
日本向けのサービスとグローバルで想定する最大ユーザ数は変わる
国内ならuserのpkはintで良いかも、グローバルなら bigintやuuidが必要