数据库设计:具有多种数据类型的拆分列

时间:2017-09-08 14:59:51

标签: mysql database-design entity-attribute-value

我需要分离一个名为AMOUNT的旧数据库字段,该字段允许用户将多种类型的数字数据(例如,小数,整数,百分比)存储到同一列中。值的范围可以从100,000,000.00到0.00。

AMOUNT中存储的值可以表示四种不同的数据格式:

  • 以当地货币表示的金额(例如,以欧元,美元,日元计算的100,000,000.00至00.00之间的值......)
  • 整数金额(例如0到12之间的整数)
  • 百分比数量(例如,介于1和0.01之间的值)

示例:

CURRENCY_ID |   AMOUNT  |   TYPE      |
     1      |  1000000  |  Currency   |
     2      |  43234.33 |  Currency   | 
   NULL     |    12     |  Integer    |
   NULL     |   0.67    |  Percentage |
   NULL     |   0.58    |  Percentage |
   NULL     |    10     |  Integer    |

我提出了以下设计建议:

  1. 创建一个名为TYPE_ID的新列,表示数据类型ID(即1 =以本地货币表示的金额,2 =整数金额,3 =百分比金额)并将其链接到单独的表格包含所有可能的类型ID。

    CURRENCY_ID |  TYPE_ID |  AMOUNT
         1      |     1    |  1000000 
         2      |     1    |  43234.33
       NULL     |     2    |    12
       NULL     |     3    |    0.67
       NULL     |     3    |    0.58
       NULL     |     2    |    10
    
  2. 然而,我看到的问题是,AMOUNT列中的金额仍然代表不同的格式(大整数和小小数),因此不统一。

    1. 为每种数据类型(即AMOUNT_LOCAL_CURRENCYAMOUNT_PERCENTAGEAMOUNT_INTEGER)创建一个新列,并将AMOUNT的值存储到相应的列中。

      CURRENCY_ID |  AMOUNT_LOCAL_CURRENCY | AMOUNT_INTEGER | AMOUNT_PERCENTAGE
           1      |       1000000          |     NULL       |      NULL
           2      |       43234.33         |     NULL       |      NULL
         NULL     |         NULL           |      12        |      NULL
         NULL     |         NULL           |     NULL       |      0.67
         NULL     |         NULL           |     NULL       |      0.58
         NULL     |         NULL           |      10        |      NULL
      
    2. 问题在于数据格式的数量会增加,这意味着每次创建新格式时都会添加新列。

      本地货币已有一个自己的标识符表。

      用于区分AMOUNT列中各种类型数据的合适且可扩展的设计是什么?

      提前谢谢!

      Markus

2 个答案:

答案 0 :(得分:0)

请实施此

使用本地货币标识符表的CURRENCY_ID列,并为整数(1001)和百分比(1002)添加更多行,无论将来在货币主表中可能不使用更高的代码。

currency master for sample

Currency_ID | Type
1           | dollar
2           | euro  
1001        | INT_Amt
1002        | PERC_AMT
  
      
  1. 您的Amount表将以旧方式引用currency_ID列:
  2.   
CURRENCY_ID |  AMOUNT
     1      |  1000000 
     2      |  43234.33
   1001     |   12
   1002     |   0.67
   1002     |   0.58
   1001     |   10

答案 1 :(得分:0)

数据库表的 idea 是在不同的列(字段)中存储和检索不同的(读取不相关的)值,这样处理它们就会更容易,而且你不会得到一个crapload每当你需要操纵它时,IF语句。

总是最好为每种输入类型创建一个新列。在显示时处理显示问题,而不是在SQL中处理。

根据经验,Option 2是最好的