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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

4回答

1824閲覧

およびデータベース VS 配列データ

chapp

総合スコア233

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

2クリップ

投稿2017/10/19 11:15

お世話になります。初歩的なことかも知れませんが、例えば会員登録などで
性別 男or女
血液型 A・B・O・AB
などを選択してもらい、各データを個人情報として登録する場面があるかと思います。

これまで上記、性別や血液型などは、

sexテーブル no name ---------------- 1   男 2   女

のようにテーブルを用意して置き、各名称のID(番号)を、今回の例でいう個人情報テーブルに格納していましたが、血液型テーブルや性別テーブルなどのように、情報の量が少ないのであれば、データベースを用いず、

<?php sex = array("男", "女"); ?>

のように配列データを記述したファイルを事前に用意しておき、都度そのファイルを参照すれば、データベースと同じ機能を得られると思います。

そこで質問ですが、このような場合、事前に配列データを設けてそのデータを参照するのと、データベースを参照するのと、どちらがお勧めなのでしょうか?
ご意見伺えれば幸いです。よろしくお願いいたします。

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

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

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

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

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

guest

回答4

0

ベストアンサー

たしかに性別・血液型など追加・変更・削除が起きる可能性がほぼ無く選択肢も少ない場合は別テーブルに定義するのは大げさと思います。

かといって今回のプログラム側の配列を参照する方法も、記録されたデータが "血液型: 3" と意味を失ってしまう(値から意図する情報が直接得られない)課題があります。

MySQLをはじめ主要なRDBに用意されている ENUM型 というデータタイプを使ってみてはどうでしょうか?

sql

1CREATE TABLE member ( 2 name varchar(64) NOT NULL, 3 gender ENUM('男性','女性') NOT NULL, 4 blood ENUM('A','B','O','AB') NOT NULL 5)

ENUMは指定したリストの値のみを持つようにできます。また内部的には数値として記録されるので varchar よりもデータサイズが小さくなり、高速に動作します。個人的には都道府県くらいまでなら ENUM でもいいかなと思っています。

それ以上増えたり変動する可能性がある場合は、別途テーブルを作り外部キー制約を使うようにすればよいと思います。

投稿2017/10/19 11:27

編集2017/10/19 11:36
miyahan

総合スコア3095

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

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

chapp

2017/10/20 06:26

miyahanさま 貴重なアドバイスをありがとうございます。お恥ずかしながら、これまでENUM型を知りませんでした。今回アドバイスをいただき調べていますが、今後のテーブル設計においても幅が広がりそうな気がします。ありがとうございました。
guest

0

「格納の話」と、格納されたIDを「表示用の名称に変換する話(DECODE)」の2つと理解しました。

根底にあるのは、

一般的にはデータベースにすべて入れるの一択です。

というのに私も賛成です。
とはいえ、マスタなくても0:不明、1:男性、2:女性とかメモで管理するのは、よくやります。

格納は、ENUMを利用するにしても表示名を格納しないほうが良いと思います。

表示処理については、テーブルとJOINして表示名を取得するというのもありますが、
単純に多言語対応とか考えるとアプリ側(PHP)でやっても良いかと思います。
※あとはデコード関数とかあるけど、それを使うぐらいならアプリ側でやります

投稿2017/10/19 12:27

momon-ga

総合スコア4820

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

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

chapp

2017/10/20 08:05

momon-gaさま 貴重なアドバイスをありがとうございます。 多くの方のご意見・考え方がとても参考になります。ありがとうございました。
guest

0

事前に配列データを設けてそのデータを参照するのと、データベースを参照するのと、どちらがお勧めなのでしょうか?

どっちも正解、好きなように作ろう。
ただし静的なテキストデータで残す場合はゴミデータがあちらこちらに散らばらないように工夫してね。


配列データを記述したファイルを事前に用意しておき、都度そのファイルを参照すれば、データベースと同じ機能を得られると思います。

その通り!
データベースに入らなければならない情報は、
そのデータがなくなってもサービスとしては成り立つけど、高速に読み書き追記が出来なければならない情報のみ。
それ以外は設計次第なので、自由に決めれば良い。

登録フォームの性別や年代、血液型などはコロコロ変わる情報ではないね。
一生変わらないような情報はデータベースに格納する必要はない。
(血液型はポジティブ、ネガティブの区分もあるし、性別の区別がない宇宙人や異世界人が住み始めたらどうすんのって話はあるけど…)

別にDBに入れてもいいけど、登録フォームを表示するためだけに2つ以上のSQL文発行する?
PHPに落とし込むと色々含めて10行程のおまじないになりかねないから、私はやりたくないなぁ……

SQL

1SELECT * FROM sexes ORDER BY id; 2SELECT * FROM bloods ORDER BY id; -- どう見てもロスのストリートギャング

まぁ、似たようなフォームを大量に生成するシステムで、
出力項目がフレキシブルな設計にしておきたいとかいう思想の元作られている場合、
性別や血液型もDBに組み込むべきだったりする。この辺も含めて思想や設計次第ってわけだね。


さて、話を元に戻して

ソースコードにベタっと書いておきたい情報は定数として宣言されることが多い。
index.phpやconfig.php等という絶対通るファイルに下記のような感じで定数を定義しておけば、
コードのどこからでも自由にアクセス出来る。

PHP

1if (!defined('SEX')) { 2 define('SEX', [ 3 1 => '男', 4 2 => '女', 5 ]); 6);

※ PHP7.0以降は定数で配列を宣言出来るようになった

投稿2017/10/20 02:36

miyabi-sun

総合スコア21158

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

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

chapp

2017/10/20 08:10

miyabi-sunさま 貴重なアドバイスをありがとうございます。 >データベースに入らなければならない情報は、そのデータがなくなってもサービスとしては成り立つけど、高速に読み書き追記が出来なければならない情報のみ。 >登録フォームの性別や年代、血液型などはコロコロ変わる情報ではないね。 >一生変わらないような情報はデータベースに格納する必要はない。 とのご意見、他の方から「そもそもそこまで正規化しないという手はある」との意見もあり、まだまだぼんやりですが、テーブル設計に関し「こうした方が良いのかな・・・」的なものが、見えてきたような気がします。 貴重なご意見ありがとうございました。
guest

0

一般的にはデータベースにすべて入れるの一択です。
データベースのみで別のロジックを働かせる(例えば解析等)を実施しようとした時に、データベース内にすべてのデータが入っていないと、働かせようがありません。

追記
質問の主旨とはズレますが、そもそもそこまで正規化しないという手はあると思います。

投稿2017/10/19 11:20

編集2017/10/19 11:25
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

chapp

2017/10/20 07:34

te2jiさま 貴重なアドバイスをありがとうございます。 「一般的にはデータベースにすべて入れるの一択です」とのコメントに納得しながらも、「そもそもそこまで正規化しないという手はある」とのコメントに、考えさせられました。取り扱うデータを見直します。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問