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

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

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

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

Q&A

解決済

3回答

1606閲覧

RDBにおける追加が起こり得る重複する属性のスキマタイズ

Daiki-Kawanuma

総合スコア29

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

0グッド

0クリップ

投稿2015/08/26 09:28

RDBのスキーマ設計で悩んでおります。
今、複数のフラグ属性を持つテーブルを設計しているのですが、状況に応じて今後そのフラグが増えていくことが考えられます。
例としまして、

天気テーブル

*日付
天気
最高気温
最低気温
平均湿度
夏日(フラグ)
猛暑日(フラグ)
台風(フラグ)←新たに追加
ゲリラ豪雨(フラグ)←新たに追加
異常気象(フラグ)←新たに追加

上記例のテーブルのように新たに追加したい属性が増えるような形です。
そもそもフラグを持つ理由としましては、他の属性から算出することが難しく人手で入力するしかないフラグがあること、余計なJOINをせず実行速度を上げたいことがあります。
スキーマをフラグの追加の度に更新することも手段として考えられますが、プログラム側の修正が多岐に渡るので現実的な解ではないと思っています。

このようなフラグ間で重複があるが、状況に応じてフラグを追加したい場合の有効な方法はありますでしょうか?
よろしくお願いします。

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

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

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

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

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

guest

回答3

0

余計なJOINと言われてますが、そもそもテーブルを分けるのは
プログラム側の修正を最小限にするためのセオリーなので、
まさにJOINの出番だと思います。
私なら素直にJOINして、速度が足りないなら何か他の工夫を考えます。
しかし事情もあると思うので、素直に別テーブルできないのなら、
先のお二人の言われるように一つのフィールドに複数の値を格納するか、
とても気持ち悪いですが、予備フィールドを作っておくか、
くらいしか選択肢がないように思います。

投稿2015/08/26 16:45

kokardy

総合スコア781

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

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

Daiki-Kawanuma

2015/08/26 17:59

ご回答頂きありがとうございます。 >>余計なJOINと言われてますが... 全くその通りだと反省します。少なくとも3NFには落とし込みたいのですが・・・。 >>しかし事情もあると思うので... ご配慮頂きありがとうございます。予備フィールドを作る手も考えましたが、予備フィールドの数もいくつになるか予測できない状況です。 1NFでなくなり正直嫌なのですが、複値をもつフィールドを設定しようと思います。
guest

0

正しくデータを表現しないテーブルになるので、あまり良い手段とはいえませんが、
1列に複数値をいれてしまう方法はあります。

1つのフラグ列に、[夏日,台風]と値をいれて、分離符記号(この場合はカンマ)を使って、プログラム側で2つの値として処理します。

問題点としては、上の回答とおなじように、このフラグで抽出したい場合に、LIKEを使うことになってインデックスが利用されないという点です。

投稿2015/08/26 10:26

disc_7

総合スコア100

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

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

Daiki-Kawanuma

2015/08/26 18:12

ご回答頂きありがとうございます。 ご提案頂きましたように複値を用いた手法を検討したいと思います。 分離符記号を用いた手法は理解する上では一目瞭然で分かりやすいのですが、実行速度的には整数値を用いた方が分がありそうなので、そちらを採用しようと思います。 (インデックスサーチができるような数の設定を何とか考えようと思います)
guest

0

ベストアンサー

フラグというのが文字通り真偽値であるのなら、flagsとでも名付けた64ビット整数カラムを一つだけ用意し、各ビットの意味付けだけあとから追加していくという構成はいかがでしょうか。

欠点はビットごとのインデックスを張れないのでフラグによる絞り込みが全件スキャンになってしまう点とります。

投稿2015/08/26 09:46

yuba

総合スコア5568

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

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

Daiki-Kawanuma

2015/08/26 18:09

ご回答頂きありがとうございます。 私も"01"を用いた整数カラムは一応機能するかな、と考えておりました。 ご意見を頂きましたので、この案で決行しようと思います。 >>欠点はビットごとのインデックスを張れないので... この点は残念なところですが、数の設定次第ではインデックスサーチも可能ではないかと考えているので、検討していきたいと思います。 私の考える実装に最も近いお考えを頂きましたので、ベストアンサーにさせて頂きます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問