電子書籍の厳選無料作品が豊富!

チェックボックスで、複数の項目をフラグとして扱うにあたって
ビット演算を使いたいと思っています。

この時、チェックボックスを作成するフォームの値は
<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に保存してやるというロジックでいいのでしょうか?
他のポータルサイトのソースをみても、そんなやり方してるサイトをみかけないので
はたしてこれで合ってるのか不安になってきて質問させて頂きました。

A 回答 (2件)

ご質問の方法でも、ロジック的には恐らく正しいと思いますし、データがコンパクトになるという利点もあると思います。



ちなみに、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たる私個人の経験に基づく、私的見解ですので、あくまでご参考まで・・・。
    • good
    • 0
この回答へのお礼

回答有り難うございます。
チェックボックスが20個くらいになって
なってきたら booleanだらけになってくるので
どうなのかなとおもったのですが、
”分かりやすさ”という点を意識するなら
たしかにビット演算用の数値がはいると
ややこしいかもしれませんね。

お礼日時:2012/05/22 10:48

検索性や拡張性など考慮するとビット演算でデータを持つのは


必ずしも効率的だとはいえません
カテゴリーテーブルをつくってユーザーIDとカテゴリーIDを
ひもづける処理をしたほうが良いでしょう
    • good
    • 0
この回答へのお礼

回答有り難うございます。
メインテーブルと関連付けた
フラグ用のテーブルをひとつ作ってそこで
管理していったほうが分かりやすそうですね。

お礼日時:2012/05/22 10:43

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報