1画面に複数選択のチェックボックスを作成する際の
DB設計について質問です。
例えば、10個のチェックボックスがある場合、
設計の仕方は色々あると思いますが、チェックボックスの項目数を増えることを想定して集計作業をする際、一番良いものを教えてください。
1.テーブルの項目(数値タイプ)を10個持たせる。←よくやっている人がいますが、チェックボックスが追加されるたび、項目追加しないといけない。
2.テーブルの項目を1つにして文字列10文字にして、'0000000010'みたいな感じで保存する。文字列10文字→文字列11にすれば良いだけ。
3.主テーブルと副テーブルを作って1対10にして副テーブル側にチェックボックスの値を持たせる。→テーブルを連結しなければならないので、SQLが長くなりがち。
4.その他
自分の考えですが、自作関数さえ作ってしまえば、2の方がSQLも複雑にならず、メンテナンスしやすいと思っています。
また、DB設計する際に読んでおいた方が良いサイトとかありましたら、
教えてください。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答7件
0
自分なら、(システム面などからの制約条件がない状況では)迷わず3を選択します。
1つの列に多数の属性を詰め込むと、何かとハンドリングが面倒になります。例えば、「3番目だけ1のレコード」を選択するとなると、LIKE
を使って書くしかないため、インデックスも効かせられません。SQLアンチパターンでも、Jaywalkingとして1番目に挙げられています。
実際、カンマ区切りで1列に入れてしまったものがあるのですが、あとあとのハンドリングに手を焼いています。
投稿2015/05/19 00:37
総合スコア146564
0
ベストアンサー
maisumakun さんと、同様に3です。
1:10が、副テーブルに、10行でという事ならば、場合によりけりでは?
縦持ちデータを、横持変換するのが面倒という方もいらっしゃいますが、これも、場合によりけり。
プログラム側でやった方が楽な場合、クエリ側でやった方が楽な場合、諸事情もあるでしょうし。
’
まともなDBであれば、View や ストアド で、
>テーブルを連結しなければならないので、SQLが長くなりがち。
は、解決可能だし。
’
>あと、主テーブルが10万レコードある場合、単純に副テーブルは100万レコードになるわけですよね。
>それでもこちらの方が良いですか?
正規化が、正しく行われていて、
適切なインデックスが、付与されていて、
適切なクエリが、発行されるのでれば、
10万件だろうと、100万件だろうと、違いはありませんし、
その為に、クエリのチューニング含めて、全体のチューニングを行います。
(私の分野では、あえて、正規化しない場合も、あります。
生のデータを、取得したまま保存の必要があったり。
これらは、パフォーマンスが出ない等、無駄を承知で、行います。)
投稿2015/05/19 01:15
総合スコア2030
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/05/21 03:20

0
「チェックボックスの項目数を増えることを想定して」とのことですが、その頻度によると思います。もしかしたらいつか変更があるかもしれないしないかもしれないという程度だったら、1でいいと思います。
増やす予定が初めからあるのだったら2か3、できれば3。頻度が高ければ必ず3にすべき、低ければ2でもいいという感じだと思います。
1の場合、チェックボックスを増やすたびに、テーブルの定義とプログラムの変更が必要です。
2の場合、チェックボックスを増やすたびに、プログラムの変更が必要です。
3の場合、チェックボックスを増やすたびに、マスタデータの追加が必要です。
また変更頻度が高いと分かっているのなら、ユーザー操作だけで変更できるように、管理画面でチェックボックスの追加や削除を出来るようにしておくことが望ましいでしょうね。
投稿2015/05/21 02:52
総合スコア902
0
私は、完全に3です。
※ 2の'0000000010'と文字型で持つのはやめた方が良いですが……。
ビット派が出てきたので、その違いについて。
ビット派は、抽出時に総スキャンにならざるを得ませんが、データ量も小さく効率的です。
しかし、ある項目で、それまでは、「はい」「いいえ」のチェックボックスだったものが、「はい」「いいえ」「どちらでもない」の3値に変わることはしばしば起こります。
そのときに対応できなくなる。というのがマイナスポイントです。
文字型なら対応でき「データを入れて表示するだけ」を考えればそれでも良いのですが、3項目目がTrueの且つ、4項目目がFalseのデータ件数、傾向が見たい。
などの分析に使うときに苦労します。
トータル的に考えれば3になるわけです。
投稿2015/05/21 02:37
総合スコア295
0
自分も3ですね
チェック項目をマスタ化して
mst_checkテーブル
カラム:checkno、checkmame、hissuflg
チェックNo、チェック項目名、チェックが必須か
user_checkテーブル
カラム名:userid、checkno、check
ユーザid、チェックNo、チェック状態(true、false)
みたいにつくります。
必須フラグは規約に同意とか用です。
投稿2015/05/20 16:02
編集2015/05/20 16:10
退会済みユーザー
総合スコア0
0
項目数が64個以内ですむなら、
普通にint/bigint型カラム1個でbitとして管理しますね。(2番)
MySQLだったらSET型っていうチェックボックスの為にあるんじゃないかっていうくらいの型があるんですが。。。
項目が100とかになるなら3番を選択しますね。
投稿2015/05/20 15:12
編集2015/05/20 15:14総合スコア843
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/05/19 00:55
2015/05/19 01:15
2015/05/19 01:44