質問: 【mysql.php】チェックボックスの処理 データベースにチェックボックスのon、off状態を 保存しようとしているのですが、 やり方が色々あり、どのやり方が一番いいのかわかりません。 調べたところ、大きく以下の4つがあることがわかりました。 ----------------------------------------- 方法1 チェックボックス分カラムを用意する ----------------------------------------- 例 id name flag4 flag3 flag2 flag1 15 なまえ 1 1 0 0 ----------------------------------------- 方法2 ビット演算を使う ----------------------------------------- id name bit 15 なまえ 12 ----------------------------------------- 方法3 カンマで区切ってデータを入れる ----------------------------------------- id name check 15 なまえ 3,4 ----------------------------------------- 方法4 チェックボックス管理テーブルを作る ----------------------------------------- main_tb id name 15 なまえ check_tb id check 15 4 15 3 それぞれ、一長一短があると思うのですが それぞれのメリット・デメリット、一般的にどの方法が好まれているのか等 アドバイス頂けると嬉しいです。
回答: あくまで私見ですが参考までに →一般的には(1)が好まれるのではないでしょうか 往々にして選択肢というのはシステムの運用が始まると拡張することがないため 1レコードに個別に埋め込むのが感覚的にももっとも適しているため メリット: 特定のレコードに対する有無だけをチェックする場合はもっとも効率的 データ構造が単純なためイメージしやすい (ようはエクセルちっくなデータだと思えばよいので) デメリット: 項目が増えるといちいちカラムを増やさないといけず、多くの選択肢がある 場合は物理的に対応できないなど、スケーラビリティが低い 冗長なもち方のため集計や抽出の際にあまり効率的なsqlをかけない →次に(2)と(3)はほぼ同様のケースであまりsqlライクではありません とくに(3)のような持ち方だとおおよそsqlとしての集計には向きません (例示の(2)はビット処理じゃないですね?1と2がチェックなら3?) メリット: カラム数がへらせる データの拡張が容易 デメリット: とくにインデックスがききにくいため大量のデータ処理にはむかない データに制限をつけにくい →個人的には(4)を使うケースが多いです メリット: 集計が簡単で簡便なsql文で表現できる 拡張性はたかい デメリット: かならず集計のsqlが必要になるためなれないとsql文が書きにくい ただし最初に書いた通り、拡張する必要があるかどうかで(1)の方を選ぶことも 多々ありそれはケースバイケースで設計時点で調整します