ビンゴマスタ側はまぁこうだろう。
# ビンゴマスタ
bingos
title : varchar
# ビンゴマスタの各マスの中身
bingo_cells
bingo_id
position : int (1..25)
label : varchar
で、ユーザが回答したものをどう書くか。
1. 1マス1レコード
bingo_results
user_id
bingo_id
position : int (1..25)
checked : boolean
- 1-1: 必ず 9 or 25 レコード作る
- 無駄レコードが多いのでなるべく避けたそう
- 1-2: 達成したマスだけレコード作る
- こっちなら
checkedカラムも要らないね。行がある=チェックされている
- こっちなら
2. カラムで持つ
bingo_results
user_id
bingo_id
checked_1 : boolean
checked_2 : boolean
...
checked_25 : boolean
25 カラム以上は増えないのでまぁ悪くはなさそう。集計も簡単そう。
この場合マスタ側も position をカラムで持たず、varchar で 25 カラム持ちそう。
3. 配列で持つ
bingo_results
user_id
bingo_id
checks_json : jsonb ([true, true, false, ...])
アプリケーション側で扱いやすいなら非常に良さそう。
4. bitfield
bingo_results
user_id
bingo_id
checks : bigint # 各 position をそれぞれ 1, 2, 4, 8, ..., 16,777,216
25 マスなら 32bit に収まるので bigint にする必要もなさそう。
ラインが揃っているかを mask で表現できるのは面白そう。
アプリケーションで扱うのは多少面倒なので、いい ORM があるかどうかに依存しそう。