お世話になります。
データーベースでのチェックボックスの持ち方についていくつか方法があるかと思います。
1.テーブルに必要項目分のフィールドを追加する
2.1フィールドにビットフラグやカンマつなぎなどで持つ
3.別テーブルとして持ち親子関係にする
正規化的に3が最もいいと思いますが、
その実装方法として考えているのが、以下のようになります
全テーブルで共通のcheckboxsテーブルを1つ作成し、
各テーブルはそのテーブルからcheckboxの値を取得します。
このような設計にした場合、各画面に必要なチェックボックスを1つ1つ指定する必要があるのが1つ面倒なポイントになる気がしています。
例えば、権限設定の場合だとこの設計では
html
1<input type="checkbox" name="permission_r" value="1">閲覧 2<input type="checkbox" name="permission_w" value="1">登録 3<input type="checkbox" name="permission_x" value="1">削除
になると思います。
別の方法としては
html
1<input type="checkbox" name="permission[]" value="1">閲覧 2<input type="checkbox" name="permission[]" value="2">登録 3<input type="checkbox" name="permission[]" value="3">削除
として、サーバー側でハンドリングするという形です。
上記②の方法で格納すれば配列で受け取った値をカンマで繋げばよいだけですので処理は楽になりますが、変更に弱かったり検索の必要が出てくる場合は非常にまずくなりますので、③の方法がよいと考えています。
上記の設計で起きうる問題点などがあれば教えていただきたいです。
また、これは②の様なタイプの設計パターンになりますが、カンマつなぎで登録する場合、
値を1,2,3のような値で格納するか、閲覧、登録、削除と文字列で格納するか、またはr,x,xのように文字列でもアルファベットにする場合などでそれぞれどのようなメリット、デメリットがあるか教えていただきたいです。
よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
チェックボックスを外部テーブル化するかどうかについては
不特定性があるかどうかが重要です
つまり、閲覧、登録、削除のように項目に規則性が高く排他性がないものについては
ユーザーテーブルの中にカラムとしてそれぞれを独立して持たせるのが有効です
逆に「趣味」や「アンケート」などユーザーや管理者側が任意に増やしていくようなものは
外部の専用テーブルにわけて、ユーザーテーブルと専用テーブル間に中間テーブルを設けるのが賢明です。
そうすることにより、専用テーブルをプログラムで走査すれば選択していないものも表示でき
任意にチェック状態を変更することが可能です。(変更するのは中間テーブル)
投稿2018/01/08 04:31
総合スコア114843
0
ベストアンサー
こんにちは。期待している回答ではないかもしれませんが、
私ならこうする というものをコメントします。
■ チェックボックスの場合
チェックボックスの場合は、チェックあり/なし の状態が管理できれば良いので、
boolean型がわかりやすいと思いました。
(チェックボックス用のテーブルは作成しない)
例に書かれている権限設定の場合、
「閲覧、登録 の権限は付与するけど、削除は付与しない」
「閲覧 の権限しか付与しない」
など、チェックボックスの場合は、組み合わせ管理も必要になると思いますので、
それぞれの情報をDBの項目として定義した方が管理がやりやすいと思いました。
■ラジオボタンの場合
ラジオボタンの場合は、選択肢のどれが選択されているかを識別できれば良いので、選択グループ単位で項目を定義して、選択肢の数や内容に応じて、項目属性を決定したら良いと思いました。
個人的には、DBに格納されている値から選択内容が推測できるようにした方がわかりやすい気がするので、私なら文字型でコードを定義すると思います。
この場合は、例で書かれているように選択肢の値と名称を管理するテーブルを定義して一元管理した方が作りやすいと思いました。
私なら、こんな感じでテーブル設計をすると思います。
各テーブルの中で、項目を定義して値管理をします。
このやり方のメリットとしては、
UI側は、項目ごとの値を検索してラジオボタン配置、ドロップダウンリストに追加するようにコーディングしておけば、選択可能値をレコードに追加/削除するだけで管理ができる点です。
デメリットとしては、
外部キーの定義できないと思いますので、プログラム側で値の制御が必要になります。
投稿2018/01/08 04:45
総合スコア125
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/08 09:02
2018/01/09 02:47
0
「このような設計にした場合、各画面に必要なチェックボックスを1つ1つ指定する必要があるのが1つ面倒なポイントになる」と仰っていますが1、2、3どの手法をとったとしてもそれは同じでは?
個人的にはテーブルに「checkboxs_name」というフィールドがあるのは違和感があります。今は権限のチェックに関して例にあげられていますが、ユーザーの削除フラグや別のフラグも入れるというならばあまり良い設計とは思えません。
自分ならusersのテーブルにすべて入れると思います。その上で、フィールドを分けるかビット演算かは「複数値の組み合わせで検索し候補が増える可能性があるか」で決めます。
投稿2018/01/06 05:55
総合スコア3828
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/06 06:25
2018/01/06 07:27
2018/01/06 07:32
2018/01/06 08:24
2018/01/06 08:52
2018/01/06 09:33
2018/01/08 06:23 編集
2018/01/08 12:13
0
こんにちは。
上記の設計で起きうる問題点
とのことですが、拝読して疑問に思ったのが、
後々、入力のUIが変わったり、別のUIからの入力にも
対応しなければならなくなった場合、どうやって対応するのか?
ということです。
たとえば、例として挙げられている、
html
1<input type="checkbox" name="permission_r" value="1">閲覧 2<input type="checkbox" name="permission_w" value="1">登録 3<input type="checkbox" name="permission_x" value="1">削除
は 初期リリースのPC画面用に作ったものとしますと、
将来、画面デザインのリニューアルや、もしくは別の
デバイス(iPadなど)用の登録画面を作ることになって、
そこでは複数選択の <select>
になったと仮定すると、
その場合はどうなるのでしょうか?
おそらくUI側は
html
1<select name="permission" multiple> 2 <option value="r">閲覧 3 <option value="w">登録 4 <option value="x">削除 5</select>
のようになると想定していますが、このとき DBふくむバックエンド側は
どういう対応をするのでしょうか?
- select から入力されたものでも、
xxxx_checkbox
テーブルを参照する。
または、
- 新たに、
xxxx_select
あるいは、xxxx_option
のようなテーブルを新規に追加する。
といった対応をするのでしょうか?
疑問に思ったことは以上です。
参考になれば幸いです。
投稿2018/01/06 05:51
編集2018/01/06 05:59総合スコア9058
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/06 06:18
2018/01/06 06:45
2018/01/06 06:57
2018/01/08 10:55
2018/01/09 01:01
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/08 07:07 編集