
チェックボックスで、複数の項目をフラグとして扱うにあたって
ビット演算を使いたいと思っています。
この時、チェックボックスを作成するフォームの値は
<input type="checkbox" name="category[]" value="1" />ライフ
<input type="checkbox" name="category[]" value="2" />デジタルライフ
<input type="checkbox" name="category[]" value="4" />趣味
<input type="checkbox" name="category[]" value="8" />エンターテイメント
.
.
.
と、valueの値をべき乗づつ増やしてくもしくは、あるいは
value の値を1234としてやってあとでx2するかして
それらの合計(例えばチェック状態が00101 なら 5)を
DBに保存してやるというロジックでいいのでしょうか?
他のポータルサイトのソースをみても、そんなやり方してるサイトをみかけないので
はたしてこれで合ってるのか不安になってきて質問させて頂きました。
No.1ベストアンサー
- 回答日時:
ご質問の方法でも、ロジック的には恐らく正しいと思いますし、データがコンパクトになるという利点もあると思います。
ちなみに、MySQLの場合は、「set型」というのもありますのでご参考まで。(他のDBとの互換性を考えるとあまり推奨はできませんが・・・)
ところで、危惧されている通り、WEB+DBにおいては、複数のチェックボックスの状態は、整数型1つにビット演算といった、「スマートな方法」でまとめるのではなく、もっと「シンプルかつ泥臭い方法」の方が好まれていると思います。
たとえば、上述の例の場合、
isLife : boolean,
isDisitalLife : boolean,
isHobby : boolean,
isEntertainment : boolean,
...
というふうに、boolean型の複数項目に展開して管理する(チェック項目が増えたら増やす)方が、あとあと良いケースもあります。(良くないケースもありますが)
また、フラグがもっと多かったり、構成が動的になる場合は、関連付け用などに、複数のテーブルを作って管理する方法も視野に入ってくるかもしれません・・・。
このように、WEB+DBでの開発は、CやC++などの開発と若干異なり、「少々、データが冗長になったり、効率が最高でなくても良いので、可能な限り、シンプルかつ分かりやすく作る」ことが多いように思います。
理由はいろいろありますが、一つに、「DBを出来る限り可読にした方が、phpMyAdminなどでの管理が楽になる」ということがあります。(ビット演算の場合、例えば132という数字で、どのフラグがONなのか、一般人には分かりにくいですが、isLifeが1になっていれば一目瞭然です。緊急にDBを手直しする必要がある場合も同様。)
こういった「管理」のほかにも、データが多くなった場合の「検索性能」や、今後のための「拡張性」など、いろいろな考慮点がありますので、どの方法が一番優れているということではなく、これらの諸点を、システムの仕様や利用形態に照らしながら、適材適所で選択されると良いと思います。
なお以上のご回答は、いちSEたる私個人の経験に基づく、私的見解ですので、あくまでご参考まで・・・。
回答有り難うございます。
チェックボックスが20個くらいになって
なってきたら booleanだらけになってくるので
どうなのかなとおもったのですが、
”分かりやすさ”という点を意識するなら
たしかにビット演算用の数値がはいると
ややこしいかもしれませんね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
処理の途中で停止させ、再開さ...
-
IF NOT EXISTを使用するINSERT文
-
仕事のミス:本番データの削除→...
-
Accessのインポートについて(上...
-
Oracleで上書きImportはできま...
-
Accessでデータシートに同じデ...
-
結合テーブルでINSERTする方法...
-
ERROR1062:Duplicate entry.......
-
【mysql : HTML】チェックボッ...
-
SQLです教えてくださいお願いし...
-
このISAMでは、リンクテーブル・・
-
ORA-01401が表示され、データが...
-
Accessの処理速度を速めるため...
-
「クリップボードにコピーされ...
-
ODBC接続で新しいレコードを追...
-
「テーブルに座って……」という...
-
会社の飲み会の幹事になり、座...
-
L2SWはARPテーブルを持っている?
-
javaでデータベース上のテーブ...
-
外部キーだけのテーブル(主キ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Accessでデータシートに同じデ...
-
Oracleで上書きImportはできま...
-
Accessのテーブルデータを一気...
-
テーブルで一番古いレコードだ...
-
このISAMでは、リンクテーブル・・
-
アクセス レコードセットを更...
-
ビューのソートについて
-
結合テーブルでINSERTする方法...
-
ORA-01401が表示され、データが...
-
ODBC接続で新しいレコードを追...
-
マテリアライズドビューとスナ...
-
accessでレコード更新直後の反...
-
MS Accessの列と行の入れ替えを...
-
重複クエリを使ったデータ削除
-
住所のDBテーブル、マスターの...
-
テーブル作成について
-
Access VBAからエクセルに出力...
-
処理の途中で停止させ、再開さ...
-
構文エラー : 演算子がありませ...
-
PostgreSQLでテーブル構成を変える
おすすめ情報