1

データベースには約 50 の製品タイプがありPostgreSQL 9.2.3ます。

割り切れるものもあれば、割り切れないものもあります。

物事をより複雑にしているのは"volume"、製品ごとに異なる精度を持つ必要があることです。

Product type 1: allowed 8 decimal places.
Product type 2: only integer values.
Product type 3: 2 decimal places
Product type 4: 2 decimal places
Product type 5: 3 ---- || ------
Product type 6: 4 ---- || ------
Product type 7: 16 ---- || -----
Product type 8: integer values
Product type 9: 4 decimal places
Product type 10: 5 decimal places
Product type 11: 12 decimal places

また"orders"、ほぼすべての列 (ユーザー、契約者、注文日、配送料など) が同じである、すべての製品用のテーブルもあります。唯一の例外は"volume"列です。

どのデータ型を使用すればよいですか?

すべての製品タイプにフィールドを使用"numeric"し、製品タイプごとに精度に関する情報を保存し、「注文記録」ビューの値を必要な精度に変換することを考えましたが、データの一貫性が失われることはありませんか?

このソリューションでは、たとえば「製品タイプ 8」の整数値が整数であるかどうかを確認する方法はありません。整数として表示するだけです。:(

もう 1 つの方法は、データ タイプごとに 1 つの列を作成することです。:(

...そして別の解決策は、次のようにテーブル継承を使用することです。

orders <- volume is integer
orders_product_1 (inherits orders) <- volume is numeric(24,8)
orders_product_2 (inherits orders) <- volume is integer
orders_product_3 (inherits orders) <- volume is numeric(20,2)

...しかし、約 20 の継承されたテーブルを作成することは、内容よりも形式の勝利のように思えます...

最善の解決策は何ですか?たぶん、問題を解決する別の方法がありますか?

4

2 に答える 2

2

NUMERIC任意の値に必要な最大のスケールと精度で使用してください。

精度が非常に静的で、同じテーブル内の別のフィールドで定義されている場合は、CHECK制約または一連の制約を使用して、値に関する規則を適用できます。

別のテーブルを参照せずにプレシジョンが見つからない場合は、代わりにトリガーを使用してルールを適用する必要があります。

私が見る唯一の代替手段CREATE TYPEは、値と単位/精度が一緒に格納されている複合型です。それは手間がかかるようで、扱うのは面倒です。

于 2013-09-04T09:24:52.187 に答える
1

数値フィールドと精度に関する情報を含むテーブルを使用した最初のソリューションを使用すると思います。この場合、必要に応じて後で精度を変更することもできます。
または、すべてのデータを整数として保存し、係数をいくつかのテーブルに保存して、フィールドを次のように計算value * coefficientできます (1、0.01 など)。

于 2013-09-04T08:59:07.450 に答える