アプリ版:「スタンプのみでお礼する」機能のリリースについて

データベースにチェックボックスのON、OFF状態を
保存しようとしているのですが、
やり方が色々あり、どのやり方が一番いいのかわかりません。
調べたところ、大きく以下の4つがあることがわかりました。

-----------------------------------------
方法1 チェックボックス分カラムを用意する
-----------------------------------------

id name flag4 flag3 flag2 flag1
15 なまえ 1   1   0  0


-----------------------------------------
方法2 ビット演算を使う
-----------------------------------------

id name bit
15 なまえ 12

-----------------------------------------
方法3 カンマで区切ってデータを入れる
-----------------------------------------

id name check
15 なまえ 3,4

-----------------------------------------
方法4 チェックボックス管理テーブルを作る
-----------------------------------------

main_tb
id name
15 なまえ

check_tb
id check
15 4
15 3 


それぞれ、一長一短があると思うのですが
それぞれのメリット・デメリット、一般的にどの方法が好まれているのか等
アドバイス頂けると嬉しいです。

A 回答 (1件)

あくまで私見ですが参考までに



→一般的には(1)が好まれるのではないでしょうか
往々にして選択肢というのはシステムの運用が始まると拡張することがないため
1レコードに個別に埋め込むのが感覚的にももっとも適しているため

メリット:
特定のレコードに対する有無だけをチェックする場合はもっとも効率的
データ構造が単純なためイメージしやすい
(ようはエクセルちっくなデータだと思えばよいので)

デメリット:
項目が増えるといちいちカラムを増やさないといけず、多くの選択肢がある
場合は物理的に対応できないなど、スケーラビリティが低い
冗長なもち方のため集計や抽出の際にあまり効率的なSQLをかけない

→次に(2)と(3)はほぼ同様のケースであまりSQLライクではありません
とくに(3)のような持ち方だとおおよそSQLとしての集計には向きません
(例示の(2)はビット処理じゃないですね?1と2がチェックなら3?)

メリット:
カラム数がへらせる
データの拡張が容易

デメリット:
とくにインデックスがききにくいため大量のデータ処理にはむかない
データに制限をつけにくい

→個人的には(4)を使うケースが多いです

メリット:
集計が簡単で簡便なSQL文で表現できる
拡張性はたかい

デメリット:
かならず集計のSQLが必要になるためなれないとSQL文が書きにくい

ただし最初に書いた通り、拡張する必要があるかどうかで(1)の方を選ぶことも
多々ありそれはケースバイケースで設計時点で調整します
    • good
    • 0
この回答へのお礼

回答有り難うございます。
メリット・デメリットをご丁寧にありがとうございます。
例示2のbit 12は 1100を10進数として挿入したとして考えた場合です。

一長一短あるので、使用するシーンで使い分けていくのがよさそうですね。

お礼日時:2014/01/22 18:13

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