如何存储可以是数值范围还是数值的数据?

时间:2016-02-27 11:09:55

标签: database database-design normalization database-normalization

在我的表格中,我需要存储一个物理数量,可以作为数值或数字间隔给出。下表说明了这个想法:

------------------------------
Isotope_ID   |  Atomic_Weight   
------------------------------
     1       |    1.00784
     2       | [6.938, 6.997] 
    ...      |       ...

此表格不可接受,因为字段Atomic_Weight包含不同类型的值。在这种情况下,最佳做法是什么?

Edit1:有三种可能的方法来表示有关原子量的信息:

  1. 值+(不确定性),例如1.00784(9)
  2. 间隔,例如[6.938,6.997]
  3. 最稳定同位素的质量数,例如38
  4. 这三个子类型不能存储在一个字段中,因为这会违反1个规范化表单。这就是示例表不可接受的原因。 我将尝试更清楚地重申我的问题:在我的数据库中存储有关原子量的信息(可以在三种不同的子类型之一中给出)的可能方法是什么?

2 个答案:

答案 0 :(得分:0)

我会选择一个包含三列的表格:

Isotope_ID, 
Atomic_Weight_From, 
Atomic_Weight_To. 

如果只有一个值,Atomic_Weight_FromAtomic_Weight_To将包含相同的值。
这样你就可以保持桌面尽可能干净,以及需要处理它的代码。

答案 1 :(得分:0)

  

作为数值或数字间隔

如果是间隔,您可以将单个值 x 存储为[ x , < EM> x ]

在此应用程序中,单个值不是精确值。它们仅代表一定精度的测量值。甚至间隔端点也仅表示测量值达到一定精度。

  

此表格不可接受,因为字段Atomic_Weight包含不同类型的值。

关系模型并不关心“类型”中的值。如果没有DBMS“类型”适合您,那么您必须编码理想的表格和列成一个或多个表和/或列。

您可以将它们编码为字符串。但是,DBMS不知道如何优化涉及其组成值的查询以及多列编码。而且你必须经常对它们进行解码和编码,以便对每个部分进行操作。

Weight_string (isotope, weight)
    // VALUES (1, '1.00874'), (2, '[6.938, 6.997]')
  

在这种情况下,最佳做法是什么?

主要模式是为每个非原始子类型提供一个表,并将子类型的值编码为一个或多个列。 (如果子类型依次有子类型,请重复。)

Weight_single (isotope, weight_single)
    // VALUES (1, 1.00874)
Weight_interval(isotope, weight_min, weight_max)
    // VALUES (2, 6.938, 6.997)

另一种模式是根据需要在每列中编码每个值,无论它们是否被使用。

Weight_1_row_NULL_unused(isotope, single, interval_min, interval_max,
    // VALUES (1, 1.00874, NULL, NULL), (2, NULL, 6.938, 6.997)

Weight_1_row_type_tag(isotope, type_tag, if_single, if_finite_min, if_finite_max)
    // VALUES (1, 'single', 1.00874, 0, 0),(2, 'interval', 0, 6.938, 6.997)

搜索重新SQL子类型/子类型表。