質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Q&A

解決済

7回答

11772閲覧

DB設計について

dthani

総合スコア131

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

0グッド

3クリップ

投稿2015/05/19 00:20

1画面に複数選択のチェックボックスを作成する際の
DB設計について質問です。

例えば、10個のチェックボックスがある場合、
設計の仕方は色々あると思いますが、チェックボックスの項目数を増えることを想定して集計作業をする際、一番良いものを教えてください。

1.テーブルの項目(数値タイプ)を10個持たせる。←よくやっている人がいますが、チェックボックスが追加されるたび、項目追加しないといけない。

2.テーブルの項目を1つにして文字列10文字にして、'0000000010'みたいな感じで保存する。文字列10文字→文字列11にすれば良いだけ。

3.主テーブルと副テーブルを作って1対10にして副テーブル側にチェックボックスの値を持たせる。→テーブルを連結しなければならないので、SQLが長くなりがち。

4.その他

自分の考えですが、自作関数さえ作ってしまえば、2の方がSQLも複雑にならず、メンテナンスしやすいと思っています。

また、DB設計する際に読んでおいた方が良いサイトとかありましたら、
教えてください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答7

0

自分なら、(システム面などからの制約条件がない状況では)迷わず3を選択します。

1つの列に多数の属性を詰め込むと、何かとハンドリングが面倒になります。例えば、「3番目だけ1のレコード」を選択するとなると、LIKEを使って書くしかないため、インデックスも効かせられません。SQLアンチパターンでも、Jaywalkingとして1番目に挙げられています。

実際、カンマ区切りで1列に入れてしまったものがあるのですが、あとあとのハンドリングに手を焼いています。

投稿2015/05/19 00:37

maisumakun

総合スコア145121

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dthani

2015/05/19 00:55

ご回答ありがとうございます。 その場合の副テーブルの項目は、「キー、CD、値」でチェックが付いていないものも作成ということでよいですか? あと、主テーブルが10万レコードある場合、単純に副テーブルは100万レコードになるわけですよね。 それでもこちらの方が良いですか?
maisumakun

2015/05/19 01:15

値がtrueのものだけ作成するか、それともfalseのものも含めるかは必要に応じて選べます。 また、trueのものだけ作成して「親テーブルのキー、項目コード」だけのテーブルになれば、UNIQUEインデックスを張るとそこにすべてのデータが含まれることになり、処理によってはかなり効率化できます(むろん、実際に使うシステムで作ってみて性能が出ないなら考えないといけませんが)。
dthani

2015/05/19 01:44

ご回答ありがとうございます。 値がtrueのものだけ作成する場合、 更新時にtrue→falseの場合、レコード削除ということですよね。 あと、履歴テーブルで履歴を取りたい場合は、falseのものを含めた方がよいでしょうか?
guest

0

ベストアンサー

maisumakun さんと、同様に3です。
1:10が、副テーブルに、10行でという事ならば、場合によりけりでは?
縦持ちデータを、横持変換するのが面倒という方もいらっしゃいますが、これも、場合によりけり。
プログラム側でやった方が楽な場合、クエリ側でやった方が楽な場合、諸事情もあるでしょうし。

まともなDBであれば、View や ストアド で、
>テーブルを連結しなければならないので、SQLが長くなりがち。
は、解決可能だし。

>あと、主テーブルが10万レコードある場合、単純に副テーブルは100万レコードになるわけですよね。
>それでもこちらの方が良いですか?
正規化が、正しく行われていて、
適切なインデックスが、付与されていて、
適切なクエリが、発行されるのでれば、
10万件だろうと、100万件だろうと、違いはありませんし、
その為に、クエリのチューニング含めて、全体のチューニングを行います。
(私の分野では、あえて、正規化しない場合も、あります。
生のデータを、取得したまま保存の必要があったり。
これらは、パフォーマンスが出ない等、無駄を承知で、行います。)

投稿2015/05/19 01:15

daive

総合スコア2028

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dthani

2015/05/19 01:45

ご回答ありがとうございます。
daive

2015/05/20 23:23

bit演算の考え方を応用して大量のチェックボックスを管理する http://blog.asial.co.jp/683 の様な記事もありますし、 仕様、実装で可能であれば、 bit (n) bit varying (n) を、検討したり、 適切に、正規化されたテーブルであれば、 複数の構造を用意して、テストしてみる事も、可能な筈です。 (データ構造が違う物を、既存に影響を与えずに用意して、使用出来るのも、  正規化をする意義の一つです。) ’ まずは、Postgres のデータ型と、他移行時の互換性、仕様との兼ね合いでしょうねぇ。
dthani

2015/05/20 23:54

ご回答ありがとうございます。 bit演算、すごいですね。 これはかなり使えそうです。 ありがとうございます。
dthani

2015/05/21 00:00

あと、そういう知識はどういう書籍、WEBなどを読んで得るのですか?
cateye

2015/05/21 03:20

私の場合は、アセンブラから入ってるのでビット演算得意派w たとえば、 ・Aという製品を作るのには10点の部品がいる ・在庫に部品があるか? などビット演算で事足りたので使ってました。
daive

2015/05/21 03:56

ネット検索は、コツがあります。 各人のコツを公開しても、役に立たないので、自分で見つけてください。 敢て書くなら、検索の仕方、検索とは 辺りから。 サイトの渉猟は、無駄にならない、自分の引出を増やすと、 考えられるかどうか。 サイト閲覧時に気になったサイトを、ローカルに保存して、 ローカル、WEB併用で検索したり。このフォルダは、あえて分類していない。 分類する場合は、関連フォルダを別途作ります。 ’ どの言語、処理系でも、まずは、一次資料を見つける事。 見付らなければ、出来るだけ一次資料に近いところを探す。 一次資料の誤りを、そのまま転載しているだけのサイトもあったりします。 ’ 出来れば、ソフトウェアだけでなく、ざっとで良いのでハードウェアロジックと、 その手法も学んでおくと、ソフトウェアに活かせます。 ビット演算、同期回路、非同期回路などは、ロジックの基礎です。 ⇒真理値表、状態遷移図、タイムチャート
dthani

2015/05/21 05:17

ご回答ありがとうございます。 参考にします。
guest

0

「チェックボックスの項目数を増えることを想定して」とのことですが、その頻度によると思います。もしかしたらいつか変更があるかもしれないしないかもしれないという程度だったら、1でいいと思います。

増やす予定が初めからあるのだったら2か3、できれば3。頻度が高ければ必ず3にすべき、低ければ2でもいいという感じだと思います。

1の場合、チェックボックスを増やすたびに、テーブルの定義とプログラムの変更が必要です。
2の場合、チェックボックスを増やすたびに、プログラムの変更が必要です。
3の場合、チェックボックスを増やすたびに、マスタデータの追加が必要です。

また変更頻度が高いと分かっているのなら、ユーザー操作だけで変更できるように、管理画面でチェックボックスの追加や削除を出来るようにしておくことが望ましいでしょうね。

投稿2015/05/21 02:52

miu_ras

総合スコア902

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dthani

2015/05/21 05:15

ご回答ありがとうございます。 参考にします。
guest

0

私は、完全に3です。
※ 2の'0000000010'と文字型で持つのはやめた方が良いですが……。
ビット派が出てきたので、その違いについて。

ビット派は、抽出時に総スキャンにならざるを得ませんが、データ量も小さく効率的です。

しかし、ある項目で、それまでは、「はい」「いいえ」のチェックボックスだったものが、「はい」「いいえ」「どちらでもない」の3値に変わることはしばしば起こります。
そのときに対応できなくなる。というのがマイナスポイントです。

文字型なら対応でき「データを入れて表示するだけ」を考えればそれでも良いのですが、3項目目がTrueの且つ、4項目目がFalseのデータ件数、傾向が見たい。
などの分析に使うときに苦労します。

トータル的に考えれば3になるわけです。

投稿2015/05/21 02:37

kantomi

総合スコア295

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dthani

2015/05/21 05:15

ご回答ありがとうございます。 参考にします。
guest

0

私もビット管理派です^^;
必要な項目にチェックが入ってるかどうかがCなら&一発で判りますし。
項目がDBで扱える整数値のビット数を超えれば3ですかね?

投稿2015/05/20 18:29

cateye

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dthani

2015/05/20 23:54

ご回答ありがとうございます。
guest

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dthani

2015/05/20 23:55

ご回答ありがとうございます。
guest

0

項目数が64個以内ですむなら、
普通にint/bigint型カラム1個でbitとして管理しますね。(2番)
MySQLだったらSET型っていうチェックボックスの為にあるんじゃないかっていうくらいの型があるんですが。。。
項目が100とかになるなら3番を選択しますね。

投稿2015/05/20 15:12

編集2015/05/20 15:14
kinme

総合スコア843

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dthani

2015/05/21 01:24

ご回答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問