質問: お世話になります。 データーベースでのチェックボックスの持ち方についていくつか方法があるかと思います。 1.テーブルに必要項目分のフィールドを追加する 2.1フィールドにビットフラグやカンマつなぎなどで持つ 3.別テーブルとして持ち親子関係にする 正規化的に3が最もいいと思いますが、 その実装方法として考えているのが、以下のようになります ![イメージ説明](https://teratail.storage.googleapis.com/uploads/contributed_images/166d7c03755096c83e033cff54720c33.png) 全テーブルで共通のcheckboxsテーブルを1つ作成し、 各テーブルはそのテーブルからcheckboxの値を取得します。 このような設計にした場合、各画面に必要なチェックボックスを1つ1つ指定する必要があるのが1つ面倒なポイントになる気がしています。 例えば、権限設定の場合だとこの設計では ``` 閲覧 登録 削除 ``` になると思います。 別の方法としては ``` 閲覧 登録 削除 ``` として、サーバー側でハンドリングするという形です。 上記2の方法で格納すれば配列で受け取った値をカンマで繋げばよいだけですので処理は楽になりますが、変更に弱かったり検索の必要が出てくる場合は非常にまずくなりますので、3の方法がよいと考えています。 上記の設計で起きうる問題点などがあれば教えていただきたいです。 また、これは2の様なタイプの設計パターンになりますが、カンマつなぎで登録する場合、 値を1,2,3のような値で格納するか、閲覧、登録、削除と文字列で格納するか、またはr,x,xのように文字列でもアルファベットにする場合などでそれぞれどのようなメリット、デメリットがあるか教えていただきたいです。 よろしくお願いします。
回答: チェックボックスを外部テーブル化するかどうかについては 不特定性があるかどうかが重要です つまり、閲覧、登録、削除のように項目に規則性が高く排他性がないものについては ユーザーテーブルの中にカラムとしてそれぞれを独立して持たせるのが有効です 逆に「趣味」や「アンケート」などユーザーや管理者側が任意に増やしていくようなものは 外部の専用テーブルにわけて、ユーザーテーブルと専用テーブル間に中間テーブルを設けるのが賢明です。 そうすることにより、専用テーブルをプログラムで走査すれば選択していないものも表示でき 任意にチェック状態を変更することが可能です。(変更するのは中間テーブル)