質問: ### 実現したいこと 単位付き数値を持つデータの扱い方について、ご意見をいただきたいです。 ### 発生している問題 以下のような数値とその単位の情報を持つカラムやテーブルが複数あり、見にくくなっています。 **単位を揃えてやればいいのでしょうが、単位も記録しておきたい**ので、このような形をとっています。 fruits テーブル | name | height | unit_of_height | width | unit_of_width | | --- | --- | --- | --- | --- | | apple | 100 | mm | 200 | cm | | banana | 300 | dm | 400 | m | ### 試したこと 1 単位付き数値として格納してみました。 カラム数が減り、すっきりしましたが `height` と `width` が数値ではなく文字列になったので計算が大変そうです。 fruits テーブル | name | height | width | | --- | --- | --- | | apple | 100mm | 200cm | | banana | 300dm | 400m | ### 試したこと 2 長さを別テーブルにしてみました。 `height` と `width` は、それぞれ `lengths` の `id` に紐付いています。 fruits テーブル | name | height | width | | --- | --- | --- | | apple | 1 | 2 | | banana | 3 | 4 | lengths テーブル | id | unit | value | | --- | --- | --- | | 1 | mm | 100 | | 2 | cm | 200 | | 3 | dm | 300 | | 4 | m | 400 | ### 補足 > > でてくる単位はその4つに限られますか、それとも任意で入力されてくるものですか。 > > > いいえ、選択肢が用意されていて、その中から選びます。 > > 単位は同じ単位系のみですか?つまりメートル系ならメートル系のみでヤード系とは混ざらない? > > > はい、メートル系であれば、そこに設定できるのはその単位系だけになります。 > > もう少し用途を明確にした方が良いです。単位を保存する意味がわからないし、数値にこだわる(どのような計算をする?)意味もわからないです。 > > > 言葉足らずですみません。 単位を保存する理由は、入力フォームの単位を揃えてしまうと、その単位に馴染みがないユーザーが扱いづらいというだけです。 計算は、プログラムで単位を揃えて足し算や引き算を行い、任意の単位で結果を返します。
回答: SQLをシンプルに記述し、パフォーマンスが良いようにするため、ひとつのカラムにはひとつの意味しか持たせてはならない、って掟があります。 カラム数が多いと思ったからと言って数値と単位をひとつのカラムにまとめたら、実際に使う時に数値と単位を分ける必要がありますから、無駄にSQLが複雑になり保守性も悪くなります。 テーブルは一度作ったら変更するとSQLもそのSQLを使っているプログラムも変更しなければなりません。システムが完成した後のテーブル設計の変更は負荷が大きいので、最初からきちんと設計しなければなりません。 DB論理設計の手順とチェックポイント