每个数据类型都有一个具有许多“精度”的字段?

时间:2013-09-04 08:40:46

标签: postgresql database-design

我的PostgreSQL 9.2.3数据库中有大约50种产品类型。

其中一些是可分割的,有些则不是。

使事情变得更复杂的是"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'的整数值 是整数,我只显示为整数。 :(

另一种方法是为每种数据类型创建一个列,例如volume_int,volume_num_2, volume_num_5等,这真的很糟糕。 :(

...另一种解决方案是使用表继承,如:

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个继承表似乎是形式胜过内容......

什么是最好的解决方案?也许有另一种方法来解决这个问题?

2 个答案:

答案 0 :(得分:2)

使用NUMERIC,您可以获得任何值所需的最大比例和精度。

如果精度非常静态并且由同一个表中的另一个字段定义,则可以使用CHECK约束或一系列约束来强制执行有关值的规则。

如果在没有查找另一个表的情况下找不到预定,则需要使用触发器来强制执行规则。

我看到的唯一选择是CREATE TYPE一个复合类型,它具有一个值,并且单位/精度存储在它旁边。这似乎很重要,并且会很难与之合作。

答案 1 :(得分:1)

我会说第一个解决方案是数字字段和表格,其中包含有关精度的信息。在这种情况下,如果需要,您也可以稍后更改精度。
或者您可以将所有数据存储为整数并将系数存储在某个表中并计算您的字段,如value * coefficient(可能是1,0.01和等等)