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

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

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

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

Q&A

解決済

3回答

1619閲覧

リレーショナルデータベースについて

ssk

総合スコア332

SQL

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

0グッド

0クリップ

投稿2017/04/06 02:11

編集2017/04/06 02:17

本を読んで勉強中です。
型について質問させてください。

HTML

1<!--選択必須ではない--> 2<input type="radio" name="hoge1" value="1">10代 3<input type="radio" name="hoge1" value="2">20代 4<input type="radio" name="hoge1" value="3">30代
idhoge1
11
22
31
hoge1_idname
110代
220代
330代

というデータベース構成の時

ラジオボックスが未選択の時も
NULLをインサートするのは避けるべきと記載がありました。

また、上記同様セレクトボックスの場合も
value="0"を準備してあげてNULLを避ける。

HTML

1<select name="hoge2" class="form-control"> 2<option value="0"></option> 3<option value="1">10代</option> 4<option value="2">20代</option> 5<option value="3">30代</option> 6</select>

###質問まとめ
・ラジオボックスが未選択の場合はhoge1のカラムには
0を入れるようにするのが良いでしょうか?

・セレクトボックスもNULLを避けるために0を入れるべきでしょうか?

・その他のテキストボックス等はNULLでも大丈夫ですか?

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2017/04/06 02:31

sskさんは仕様を決定できる立場にあるのか、仕様変更を提案できる立場にあるのか、言われたとおり作るしかないのか、どの立ち位置なんでしょうか。
ssk

2017/04/06 02:38

sskさんは仕様を決定できる立場です。最適な方法で実現したいと考え、参考書を読んで1から勉強しております。
guest

回答3

0

よく整理したほうがいいでしょう

  • SQL側で型にNULLを許諾しない、特に正規化をしているのですから今回のケースは絶対です
  • HTML上で選択肢からの選択なのだからバリデートして指定値以外の値を投入できないようにする
  • 指定値以外のデータが飛んできた場合はエラーにしてユーザーに再入力を求める
  • もしくはデフォルト値で登録する

あとはどう管理したいかによって実装は変わってきます

投稿2017/04/06 04:03

yambejp

総合スコア114839

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

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

ssk

2017/04/06 04:42

ありがとうございます。 正規化している場合はリレーション以外のテキストエリアもNULLは承諾しない方がいいですか?
yambejp

2017/04/06 04:49

そもそもhttpベースでユーザーから送られてくるデータにNULLは存在しません (攻撃目的でおくってくるNULLはありますが、それ自体は別次元で排除が必要) いずれにしろDBにNULLは許諾しないのが原則です。 テキスト系(char,varchar含む)の空は""で十分です。 また数字系のものは可能であれば「0」を利用しますが、場合によって0に 別の意味を持たせている場合があるのでやむなくNULLを使う場合もあります ただその場合0を入れておいて別カラムでこのゼロはNULLですよと指定するなど 別途工夫でなんとかすることもできそうです
ssk

2017/04/06 04:55

>>>DBにNULLは許諾しないのが原則 ありがとうございます。 そのように設計いたします。 >>>別カラムでこのゼロはNULLですよと指定 そんなこともできるんですね。。勉強になります。
guest

0

ベストアンサー

NULLはインデックスの対象にならない特別な値だから
デフォルト値を例えばゼロだの-1だのにして、
適切な入力がなかった場合に詰める、
というのはよくある話です。

データベースにNULLを入れてはいけない5つの理由: mitsuruogの日記
DB論理設計のノウハウ - Qiita

では、そのデフォルト値をどこで誰が詰めるのか、
それも仕様決定次第です。

webブラウザから送信されるリクエストが適切かどうか、
サーバー側で必ず検証して評価しなければならない(鵜呑みに出来ない)ため、
webブラウザ上での入力チェックはほどほどにして
webサーバー側言語(php, Ruby, Perl, Javaなど)で検証しますかね、普通は。

もちろん、データベース上にテーブルを定義する際に、
DEFAULT -1とかつけても良いのですが、
webサーバー側言語(php, Ruby, Perl, Javaなど)で検証してデフォルト値を詰めますかね。

投稿2017/04/06 02:45

編集2017/04/06 02:50
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

ssk

2017/04/06 03:08

ありがとうございます。 上記を参考に進めてまいります。 最後に、、 リレーショナルモデル以外のテキストフィールド等はNULLでも問題はないでしょうか?
退会済みユーザー

退会済みユーザー

2017/04/06 03:36

SELECT文等のWHERE句やHAVING句などで参照することがないのであれば、NULLでも良いと思います。
ssk

2017/04/06 04:08

SELECT文でWHERE句で検索する場合はNULLではなく''をインサートした方が良いでしょうか?
退会済みユーザー

退会済みユーザー

2017/04/06 04:30 編集

自由記入される前提の文字列ならば、インデックスしようともWHERE区などで参照したらパフォーマンスの足を引っ張るでしょう。 数パターンの文字列しかありえないのであれば、それこそ選択肢から選ばせて入力させつつ値は数値として保持するなどすれば、直接文字列で絞り込むよりもインデックスがしっかり働いてパフォーマンスが上がります。 その辺の詳しいところは、RDBMS側ドキュメントを当たっていただきたいです。 Oracleにはパフォーマンスチューニングというズバリのドキュメントがありますし、 MySQLにもMySQL :: MySQL 5.6 リファレンスマニュアル :: 8.1 最適化の概要 <https://dev.mysql.com/doc/refman/5.6/ja/optimize-overview.html>という項目があります。
ssk

2017/04/06 04:40

ありがとうございます。 上記を参考に進めて参ります。
guest

0

ラジオボックスが未選択の時も

NULLをインサートするのは避けるべきと記載がありました。

これがどのような意味合いなのかは気になりますが、少なくとも、今回のような「年齢」欄でしたら、全員網羅できるように項目を用意するのが適当です。「10代」「20代」「30代」だけとなると、10歳未満や40歳以上はどうしようもなくなります(もちろん、「70歳以上」のようにある程度のところで打ち切るのも問題はないですが)。

未選択の場合の対応ですが、どうしたいかによります。

  • セレクトボックスにrequiredをかけて、そもそも未選択では先に進ませない
  • DB側も含めて「非公開」のような項目を入れて、デフォルトではそれを選択しておく

投稿2017/04/06 02:18

編集2017/04/06 02:20
maisumakun

総合スコア145184

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

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

ssk

2017/04/06 02:27

ありがとうございます。 CSVでのインサートもあるので >>>DB側も含めて「非公開」のような項目を入れて、デフォルトではそれを選択しておく として、DB側のデフォルト値を0にしておくのが最適でしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問