この勉強会行きました
今日はこれーーhttps://t.co/BMrcjdjK4z#spzcolab#サポーターズ
— ういろう🍤👩🍤@新卒3年目PHPer (@nyamucoro) 2018年6月12日
感想
- DB設計にパターンあるの知った
- 変化に強い作り方を知った
- そもそもマスタとかキャッシュとかDBの扱い方の違いを具体的に
Twitterまとめ
■論理設計
— ういろう🍤👩🍤@新卒3年目PHPer (@nyamucoro) 2018年6月12日
DBを扱う人間のための設計
ビジネスの要件とかで作る
だいたいこれ使う#spzcolab#サポーターズ#サポーターズCoLab
■物理設計
— ういろう🍤👩🍤@新卒3年目PHPer (@nyamucoro) 2018年6月12日
DBシステムのための設計
パフォーマンスやサイズ、セキュリティを考慮
水平/垂直分割
正規化を崩す#spzcolab#サポーターズ#サポーターズCoLab
(こんな設計の用語あるのはじめてしった#spzcolab#サポーターズ#サポーターズCoLab
— ういろう🍤👩🍤@新卒3年目PHPer (@nyamucoro) 2018年6月12日
オンラインゲームを例にする。
— ういろう🍤👩🍤@新卒3年目PHPer (@nyamucoro) 2018年6月12日
ユーザー数が多い
リリース後に継続して改修#spzcolab#サポーターズ#サポーターズCoLab
サーバーAPI
— ういろう🍤👩🍤@新卒3年目PHPer (@nyamucoro) 2018年6月12日
バッチ処理
データ管理ツール
カスタマーサポート用のつる
データ分析基盤#spzcolab#サポーターズ#サポーターズCoLab
■マスタ
— ういろう🍤👩🍤@新卒3年目PHPer (@nyamucoro) 2018年6月12日
一度登録すると頻繁に更新されないデータ
クエスト・アイテム等、管理者が設定するデータ
ユーザーの基本情報
キューイングで非同期で更新されるデータ#spzcolab#サポーターズ#サポーターズCoLab
■サマリ
— ういろう🍤👩🍤@新卒3年目PHPer (@nyamucoro) 2018年6月12日
集計結果を保存する
■キャッシュ
頻繁に参照されるデータの置き場所
リアルタイム性は多少失われる
■ログ
分析用
■トランザクション
— ういろう🍤👩🍤@新卒3年目PHPer (@nyamucoro) 2018年6月12日
ユーザーIDとかで取ってこれるやつ
頻繁に更新されるデータ
所持金とかランクとか#spzcolab#サポーターズ#サポーターズCoLab
■サマリ
— ういろう🍤👩🍤@新卒3年目PHPer (@nyamucoro) 2018年6月12日
集計結果を保存する
■キャッシュ
頻繁に参照されるデータの置き場所
リアルタイム性は多少失われる
■ログ
分析用#spzcolab#サポーターズ#サポーターズCoLab
両方共、user_idで取得出来る情報だけど、
— ういろう🍤👩🍤@新卒3年目PHPer (@nyamucoro) 2018年6月12日
更新頻度で分けるべき
■マスタ
ユーザー名とか頻繁に更新されない
■トランザクション
ユーザーランクとか頻繁に更新される#spzcolab#サポーターズ#サポーターズCoLab
■マスタ
— ういろう🍤👩🍤@新卒3年目PHPer (@nyamucoro) 2018年6月12日
アイテム
名前、売値とかのデータ
■トランザクション
ユーザーのアイテム、所持数とか#spzcolab#サポーターズ#サポーターズCoLab
1対1や、1対Nでも、マスタやトランザクションで分けること出来るよね#spzcolab#サポーターズ#サポーターズCoLab
— ういろう🍤👩🍤@新卒3年目PHPer (@nyamucoro) 2018年6月12日
単一テーブル継承
— ういろう🍤👩🍤@新卒3年目PHPer (@nyamucoro) 2018年6月12日
クラステーブル継承
具象クラス継承#spzcolab#サポーターズ#サポーターズCoLab
■単一テーブル継承
— ういろう🍤👩🍤@新卒3年目PHPer (@nyamucoro) 2018年6月12日
アイテムID、名前、売値、攻撃力、合成値
クラスによって使用しないカラムにはnullを入れる
後からテーブルの構造を変えやすい。#spzcolab#サポーターズ#サポーターズCoLab
■クラステーブル継承
— ういろう🍤👩🍤@新卒3年目PHPer (@nyamucoro) 2018年6月12日
・アイテム
ID、名前、売値
・攻撃アイテム
ID、攻撃力
・素材アイテム
ID、合成値
後から構造を変えにくい。これはお作法通り#spzcolab#サポーターズ#サポーターズCoLab
具象クラス継承
— ういろう🍤👩🍤@新卒3年目PHPer (@nyamucoro) 2018年6月12日
・攻撃アイテム
攻撃アイテムID、名前、売値、攻撃力
・素材アイテム
素材アイテムID、名前、売値、合成値
NULLを許容することはないが、アイテム全体から検索することはしにくい#spzcolab#サポーターズ#サポーターズCoLab
こう考えると、なんであのテーブル単一テーブル継承なんだろうって思ったことあったけど、いろいろ納得するところもあるな#spzcolab#サポーターズ#サポーターズCoLab
— ういろう🍤👩🍤@新卒3年目PHPer (@nyamucoro) 2018年6月12日
ユーザーが所持する武器(1対N)
— ういろう🍤👩🍤@新卒3年目PHPer (@nyamucoro) 2018年6月12日
・ユーザーの所持武器
ユーザーID、武器ID、倉庫ID、レベル
レコード数が所持制限#spzcolab#サポーターズ#サポーターズCoLab
クエストクリア状況(1対N)
— ういろう🍤👩🍤@新卒3年目PHPer (@nyamucoro) 2018年6月12日
ユーザーID、クエストID、攻略情報
これでクリア状況がすぐ検索できるよね。#spzcolab#サポーターズ#サポーターズCoLab
チーム、ギルド系
— ういろう🍤👩🍤@新卒3年目PHPer (@nyamucoro) 2018年6月12日
■マスタ
チームID、チーム名、説明、メンバー数
■トランザクション
ユーザーID、チームID
■キャッシュ
検索結果#spzcolab#サポーターズ#サポーターズCoLab
ランキング
— ういろう🍤👩🍤@新卒3年目PHPer (@nyamucoro) 2018年6月12日
■トランザクションとマスタ
ユーザーID、スコア
■キャッシュ
ランキング順位#spzcolab#サポーターズ#サポーターズCoLab
ビジネスの要件を把握しよう!!!
— ういろう🍤👩🍤@新卒3年目PHPer (@nyamucoro) 2018年6月12日
テーブル設計の段階で気づくこともある#spzcolab#サポーターズ#サポーターズCoLab
既存テーブルの設計の理解をして、
— ういろう🍤👩🍤@新卒3年目PHPer (@nyamucoro) 2018年6月12日
新しいものを作るときは、コードレビューの前に設計レビュー#spzcolab#サポーターズ#サポーターズCoLab
RDBは永続化させるデータ
— ういろう🍤👩🍤@新卒3年目PHPer (@nyamucoro) 2018年6月12日
KVSは高頻度にアクセスするデータ
DWHはデータ分析する膨大なログ#spzcolab#サポーターズ#サポーターズCoLab
単一テーブル継承の場合、カラム数はどんどん増えちゃうかも。
— ういろう🍤👩🍤@新卒3年目PHPer (@nyamucoro) 2018年6月12日
でも、カラム数が増えたときの弊害って、
SELECT *のワイルドカードを利用したときだと思うから、
プログラムの方でカラムの制限をしたら良いと思うよ!#spzcolab#サポーターズ#サポーターズCoLab
そこらへんこそORマッパーで吸収してもいいのか?
— ういろう🍤👩🍤@新卒3年目PHPer (@nyamucoro) 2018年6月12日
DB設計は単一テーブル継承して、
オブジェクトの定義は具象クラスっぽくする・・・
あーでもこれ単一テーブル継承の良さが失われるのと、
具象クラスを扱うときにSELECT *なコード書けないな#spzcolab#サポーターズ#サポーターズCoLab
プログラム側のことも絡めるとさらにいろいろ考える事できそう。
— ういろう🍤👩🍤@新卒3年目PHPer (@nyamucoro) 2018年6月12日
いやーいい勉強になった。#spzcolab#サポーターズ#サポーターズCoLab