2009-08-27 3 views
4

値は、特定の単位(メートルなど)を使用してデータベースに常に保存する必要がありますか、追加のフィールドまたはテーブルを使用して単位を設定できる必要がありますか?特定の単位(メートルなど)を使用してデータベースに値を保存する必要がありますか、追加のフィールドで単位を設定できる必要がありますか?

例1:ユニットは、フィールドの一部として定義

buildings 
----------------------------- 
building_id  INT 
date_built_utc DATE 
reported_area_m DOUBLE 

例2:

buildings 
----------------------------- 
building_id   INT 
date_built   DATE 
date_built_unit  VARCHAR(50) 
reported_area  DOUBLE 
reported_area_unit VARCHAR(50) 

は、私は強く、実施例1に傾いています別のフィールドで定義されたユニット理由データを格納するための標準ユニットが1つあれば、値の報告はより簡単になり(エラーが発生しにくくなります)。アプリケーション層は、必要に応じてユニット間の変換を容易に処理できます。

どの方法が好ましいのでしょうか?その理由は何ですか?

答えて

9

を使用することができますしながら、1000倍メートルを複製したいと思います。誰かが100を読んで考えてメートルフィートよりもむしろ想像することができますか?結局のところ、the loss of a NASA orbiterの原因となっています。

編集:私が意味することは、あなたがユニットを強制することができれば、それを意味します。これにより、ユニットが何であるかについての混乱を防ぐことができます。

+0

このユニットを使用すると、すべてのユニットを格納することによって_問題が発生する可能性があります。例えば:単位「B」で顧客の注文1000年、単位「A」内のデータベースは常に店なので、あなたは、画面上のユニット「B」に戻っユニット「A」から変換するときの列は、545.5455ユニット「A」が含まれ、混乱した顧客は、彼らが問題を引き起こす可能性のあるユニット「B」で999.98を「本当に」注文したことを知るでしょう。 –

+0

私はあなたに同意します、KM。しかし、私はまだ、このアプローチは、1つの列に複数のユニットを許可するよりも潜在的な混乱が少ないと考えています。 –

+0

これは、私が避けようとしている主な問題です(一般的な混乱とメンテナンスの頭痛ではなく、軌道災害です)。 –

0

まず、フィールド名の内部情報を格納しない、私はそれが私がルックアップテーブルを作成し、

buildings 
----------------------------- 
building_id  INT 
date_built  DATE 
date_unit   INT 
reported_area  DOUBLE 
reported_unit  INT 

どうなるのベストプラクティス

だとは思わないのはなぜ、ルックアップテーブル、非常にシンプル。

は、なぜあなたはちょうど私が複数のユニットを許可することは、混乱やメンテナンスの頭痛の多くを紹介するだろうと思う数1

+0

、私はユニットは、レコードごとに定義することができるようにした場合、私は間違いなく作成しますユニットのルックアップテーブル。 –

3

単体でのアンダーフローやオーバーフローの問題に注意してください。reported_area_m DOUBLEに四角いピコメートルを保存しないでください。格納する値の範囲に合った基本単位を選択してください。

1

測定の精度やユーザーが異なる単位で値を操作する頻度によって異なります。いずれにしても、コードでは、ユーザーが必要とするすべてのユニット(たとえば、m^2、ft^2、エーカーなど)間を行き来できるようにする必要があります。私が職場で働く科学的データセットでは、データベースに保存する前に常に共通の単位に変換します。私たちがそれをしない唯一のケースは、測定値が非常に正確である(例えば、地球のサイズが最も近いミリメートルまで)場合、変換によって丸め誤差が生じる可能性がある場合です。あなたの場合(メートル対フィート、数千メートルまたはフィート、おそらく?)丸め誤差は大したことではなく、それらの間の変換は高速な線形演算です。十分。

いずれにしても、間違った単位を誤って値として扱わないように、あなたが何をしているのかを記録する必要があります。

0

あなたの質問に対する答えはもう一つの質問です:少なくともxの面積がy以下のすべての建物を見つけるにはどうすればよいですか?

4

例1は、移動するための方法です。レポートされたフィールドにSUMまたはAVGを使用するSQLクエリを記述する必要がある場合は、ユニットの列を考慮する必要がある場合にはどれほどの苦痛があるか考えてください。

また、私は列名自体に単位(メートル、フィートなど)を含むに何か問題がないと思います。これは、データベース内の他の場所にユニットが表示されないため、実際には良い考えです。

+1

これはまさに私がデータベース内の値の「報告」に関して心配していた問題です。私は他の人もこのように感じているという事実によって慰められる。 –

+0

私はそのようなクエリをどのように書くのかはわかりません。私はユニットタイプごとに1つのクエリでUNIONSの束をしなければならないと思うし、重複したユニット(「フィート」、「フィート」など)がないことを願っています。 – MusiGenesis

+0

ええ、メンテナンスの悪夢でしょう。 Crystal Reportsを使用してレポートを作成することがよくあります。私は報告書をさらに複雑にしたくはありません。 –

0

あなたは、変換に丸め誤差と一緒に暮らすことができる場合は、共通ユニットを使用すると、確かに他の人が与えたすべての理由のために、移動するための方法です。

しかし、「もし」の大きな可能性である、と考えなければなりません。非常に多くの質問のように

は、答えは私たちの

1

なしここにあなたのプロジェクトに同じ洞察あなたのやり方、この中に最良の答えを持っていない「...まあ、それはすべてが依存」である(とそう他の多くの場合)は - "それは"、ほとんどの場合はカットされている&乾燥した、普遍的にこのような質問に対する回答があります。目的が何であるかに基づいて選択する必要があり、は妥当なものですです。コミュニティは、あなたのオプションが何であるかを見つけるための素晴らしい方法ですと何の落とし穴が待ち受けている可能性が

ポーリングあなたは、アクションの特定のコースを選択する必要がありますが、決定的な答えはおそらく私たちの手の届かないところにあります。

ここで、複数の測定タイプを保存する道を辿ると、それらの間の変換方法を追跡し、それらの値を変換する際に丸め誤差を受け入れることができるという追加の責任があると指摘しています。

標準単位ですべてを格納することは、正面の両方でより簡単になるためメンテナンスの観点から望ましいことです。&バックエンド - データを別の方法で表現する必要がある場合は、データベースから取り出してまたは入る前にそれを変換する...しかし、それはあなたのユーザーの要件を満たしていますか?

1

私は列の名前で単位を保存したい:

合意
FileSizeInBytes 
TimeSpanInSeconds 
WidthInCentimeters 

など

+0

おやおや、テーブルごとに数十バイトを無駄にしているよ! – MusiGenesis

+1

あまりにも冗長なのは私のスタイル、犬です –

+1

あなたはちょうど "g"を無駄にしました、G. – MusiGenesis