データベース設計実践Night 〜ウェブサービスのテーブル設計をしてみよう〜 振り返り
設計済みのに手を加えることしかやったことない
やったことのメモとか感想とかを書いた
最初
チーム作成をすることになった
チーム名はしゅうへいになった
faker first_nameで生成した名前がしゅうへいだったのでしゅうへいにした
特に誰もチーム名決める人いなさそうだったので、適当に名前生成できるものをつかった
一緒になったメンバー
かしま:転職活動中、ポートフォリオサイトを作っている
おけい:客先常駐の技術者
つちや:ビジネスサイド・マーケティング
えむら:インターン生
やまもと:システムエンジニア
テーマ
男女のマッチングアプリを作るならどんなDBにするか?
最初のお題
男女でチャットのできる機能が欲しい
一番最初に僕が設計したテーブル
https://gyazo.com/1aa330212e68c6676da84952d8075a00
僕の考えた設計、良くない
送信者IDと受診者IDをchat_linkテーブルで管理している
チャットルームでチャットを表示するシーンを想像する
自分と相手のチャットを表示するために、2回SQLを投げる必要がある
しかも、2回投げたSQLを時間でソートする必要があるのでUNION+SORTが必要になる
クエリが複雑になる
チームメンバーからでた意見を元に、room概念でチャットのやり取りを表現するのはどうか、となった
とても良いと思う
ルームに対してチャットを紐付けることでルームに参加している人がチャットを見られるようになる
1対1のときは1対1のルームがある
room
id
name
どんな感じの関連になるかわすれた・・・。
userとroomを紐付ける中間テーブル(交差テーブル)を作ると良い
user_room
id
user_id
room_id
これでroom_idでwhereすればそのroomの発言がすべて絞り込める
https://gyazo.com/abddc30ebf1e1aa3024e488a2cd6edca
room1のメッセージを表示するためのSQLを書いた
code:chat_room.sql
SELECT r.name, u.name, m.text, m.send_at
FROM messages m
JOIN rooms r
ON m.room_id = r.id
JOIN users u
ON m.user_id = u.id
WHERE r.id = 1
ORDER BY send_at;
name name text send_at
room for user1 user1 Hello user2 2019-11-16 10:49:12
room for user1 user2 Hello user1 2019-11-16 10:49:12
room for user1 user1 Hello user2 2 2019-11-16 10:49:12
room for user1 user2 Hello user1 2 2019-11-16 10:49:12
閑話休題
次のお題
年齢で検索できるようにして、出身地を設定できるようにする
検索しやすい
年齢:生年月日
年齢を数値で持つと、誕生日になっても年齢が更新されなくなってしまう
生年月日でもつべし
住んでる場所:住所+区域の情報が必要
近くの人、という考え方で検索がしやすいようにする
関東地方、みたいな検索の仕方
都道府県だけだと、北海道とかなら絞り込むの大変だよね
ぐるなびとかは地域APIを提供している
次のお題
趣味で検索できるようにする
僕の考えた案
親にカテゴリをもつ趣味テーブルの2階層構造
category
id
name
hobby
id
name
category_id
カテゴリで趣味を分類するようにする
問題点
どこまで趣味を階層化にするか
多重階層化したときに、子供のないテーブルが発生する
マスターデータをどこまでサービス側で提供できるか
クエリが重くなりやすい、複雑になりやすい
他のチームの発表メモ
趣味の検索をどう考えるか
グループという概念を追加して、グループにタグを割り振っておく
グループに参加した人として検索もできるようにしたらよいのでは?
タグを自分で追加できるようにする
表記ゆれとかも発生し得るが、入力時に補完でだすことで緩和できるかも
まとめ
DB設計に正解は無い
良くない設計でも動いてしまうのがDB
アプリ側でがんばる
最初はデータ量が知れてるから問題が表面化しない
テーブル定義は後から変更しづらいので、最初の設計が肝心
設計をする時に、既存のサービスを参考にするのはぜひやるべき
先に満たしたい画面を想像して、その画面を表現するためにどんなSQLを書く必要があるか?も意識してテーブル設計をしたほうが問題になりにくい
2回SQLを投げる必要のあるテーブル設計をしてしまったときは、画面のほうを全然考えていなかった・・・
感想
テーブル設計を初めてやったので、学びが多かった
現役の技術者、学生などを交えて自分の考えたテーブル設計について話ができてよかった
他のチームがどういう設計にしたのかも見られて参考になった
これはとても便利
仕事でも使えると思う
次あるならまた参加したい
シェル芸勉強会でいう問題が出題されて皆で解くというやりかたと近くて好きな進め方 座学よりはこっちのほうが頭に入る
その他
Nimにも力を入れてらっしゃる方なのでお会いしたかった チームは別
medyさんの作成中のフルスタックフレームワークのバグを思いつきで修正できてしまった
プログラミングの話こんなにガッツリしたの久しぶりだった
楽しかった