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

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

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

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

SQL

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

Q&A

解決済

4回答

6997閲覧

SQLで単位付き数値の扱い方

huk66361

総合スコア8

MySQL

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

SQL

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

0グッド

0クリップ

投稿2018/10/01 10:47

編集2018/10/01 11:23

実現したいこと

単位付き数値を持つデータの扱い方について、ご意見をいただきたいです。

発生している問題

以下のような数値とその単位の情報を持つカラムやテーブルが複数あり、見にくくなっています。
単位を揃えてやればいいのでしょうが、単位も記録しておきたいので、このような形をとっています。

fruits テーブル

nameheightunit_of_heightwidthunit_of_width
apple100mm200cm
banana300dm400m

試したこと 1

単位付き数値として格納してみました。
カラム数が減り、すっきりしましたが heightwidth が数値ではなく文字列になったので計算が大変そうです。

fruits テーブル

nameheightwidth
apple100mm200cm
banana300dm400m

試したこと 2

長さを別テーブルにしてみました。
heightwidth は、それぞれ lengthsid に紐付いています。

fruits テーブル

nameheightwidth
apple12
banana34

lengths テーブル

idunitvalue
1mm100
2cm200
3dm300
4m400

補足

でてくる単位はその4つに限られますか、それとも任意で入力されてくるものですか。

いいえ、選択肢が用意されていて、その中から選びます。

単位は同じ単位系のみですか?つまりメートル系ならメートル系のみでヤード系とは混ざらない?

はい、メートル系であれば、そこに設定できるのはその単位系だけになります。

もう少し用途を明確にした方が良いです。単位を保存する意味がわからないし、数値にこだわる(どのような計算をする?)意味もわからないです。

言葉足らずですみません。
単位を保存する理由は、入力フォームの単位を揃えてしまうと、その単位に馴染みがないユーザーが扱いづらいというだけです。
計算は、プログラムで単位を揃えて足し算や引き算を行い、任意の単位で結果を返します。

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

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

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

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

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

kaz.Suenaga

2018/10/01 10:51

でてくる単位はその4つに限られますか、それとも任意で入力されてくるものですか。
papinianus

2018/10/01 10:52

単位は同じ単位系のみですか?つまりメートル系ならメートル系のみでヤード系とは混ざらない?
ssasaki

2018/10/01 10:56

もう少し用途を明確にした方が良いです。単位を保存する意味がわからないし、数値にこだわる(どのような計算をする?)意味もわからないです。
huk66361

2018/10/01 11:25

ご質問ありがとうございます。補足を追加させていただきました。
guest

回答4

0

回答は複数ありそうですが一案としてです。

  • 基準とする単位を決める(例えば「mm」)
  • 単位のマスタとして、 単位 - 基準とした単位で換算した値 のテーブルを作る
  • 質問の「fruits」テーブルの単位とそのマスタを結合して、数値と基準とした単位で換算した値をかけ合わせる

ことで、基準単位での値が取得できるかと思います。

例)

units テーブル

unitvalue
mm1
cm10
m1000

SQL

SELECT name, height, unit_of_height, unit_of_height * U1.value AS unit_of_height_by_mm , width, unit_of_width, unit_of_width * U2.value AS unit_of_width_by_mm , From fruits LEFT JOIN units U1 ON fruits.unit_of_height = U1.unit LEFT JOIN units U2 ON fruits.unit_of_width = U2.unit

みたいな感じです。
(テストしていないのでケアレスミスはあるかも)

投稿2018/10/01 11:38

kaz.Suenaga

総合スコア2037

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

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

huk66361

2018/10/01 11:52

ご回答ありがとうございます。 units テーブルを使った計算方法、非常に参考になります。 この場合も fruits テーブルに単位を記録する方法がいいということですね。
kaz.Suenaga

2018/10/01 11:58

実際にどのようにデータを扱うのかによって正解は違うかもしれませんがここで提示されている範囲であればレコードごとに単位の情報が必要なのは間違いないので、別のテーブルにする意味はあまりないと思います。 > 単位を保存する理由は、入力フォームの単位を揃えてしまうと、その単位に馴染みがないユーザーが扱いづらいというだけです。 > 計算は、プログラムで単位を揃えて足し算や引き算を行い、任意の単位で結果を返します。 ということであればフォームに出力する際に必要なデータが fruits テーブルだけで完結しますし。
guest

0

ベストアンサー

計算が絡む以上、DB 側の数値の単位をあわせないという選択肢は無いと思います。
単位を気にする理由がまだあまり明確ではないと思うのですが、、、

ユーザーが入力する際に好きな単位を指定したい
→フォームでは好きに選択させ、DB に書き込む時にシステム側で決まった単位に変換してやればよい

ユーザーが見やすい単位で表示したい
→プログラム側で DB から取得した値を、ユーザーの指定する単位に変換して表示してやればよい

ということで、普通の用途であれば DBに単位を持つこと自体が不要にも思います。

投稿2018/10/01 11:33

ssasaki

総合スコア1167

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

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

huk66361

2018/10/01 11:44

ご回答ありがとうございます。 数値は入力後にも変更が可能で、次回以降の入力時に前回と同じ単位で入力させたいので必要です。
huk66361

2018/10/01 11:57 編集

> プログラム側で DB から取得した値を、ユーザーの指定する単位に変換して表示してやればよい なるほど。 次回以降の入力時、フォーム側でユーザーが指定した単位に数値を直せば、確かに単位なしで記録できますね。
guest

0

SQLをシンプルに記述し、パフォーマンスが良いようにするため、ひとつのカラムにはひとつの意味しか持たせてはならない、って掟があります。
カラム数が多いと思ったからと言って数値と単位をひとつのカラムにまとめたら、実際に使う時に数値と単位を分ける必要がありますから、無駄にSQLが複雑になり保守性も悪くなります。

テーブルは一度作ったら変更するとSQLもそのSQLを使っているプログラムも変更しなければなりません。システムが完成した後のテーブル設計の変更は負荷が大きいので、最初からきちんと設計しなければなりません。
DB論理設計の手順とチェックポイント

投稿2018/10/01 18:43

Orlofsky

総合スコア16415

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

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

0

普通に単位は単位で書いて、残りはmで保存すればよいのでは

nameheightunit_of_heightwidthunit_of_width
apple0.1mm2cm
banana30dm400m

投稿2018/10/01 10:55

yambejp

総合スコア114769

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

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

huk66361

2018/10/01 11:44

ご回答ありがとうございます。 1テーブルのカラム数が多くなり見にくいのですが、やはり、この方法が一番いいのでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問