代码之家  ›  专栏  ›  技术社区  ›  Mikhail Mishin

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

  •  0
  • Mikhail Mishin  · 技术社区  · 9 年前

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

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

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

    编辑1:有三种可能的方式来表示原子量信息:

    1. 值+(不确定度),例如1.00784(9)
    2. 间隔,例如[6.938,6.997]
    3. 最稳定同位素的质量数,例如38

    这三个子类型不能存储在一个字段中,因为这将违反1规范化表单。这就是示例表不可接受的原因。 我将尝试更清楚地重申我的问题:在我的数据库中存储原子量信息(可以在三种不同的子类型中给出)的可能方法是什么?

    2 回复  |  直到 8 年前
        1
  •  0
  •   philipxy    9 年前

    作为数值或数字间隔

    对于间隔,您可以存储单个值 x [ x(x) , x(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子类型/子类型表。

        2
  •  0
  •   Zohar Peled    9 年前

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

    Isotope_ID, 
    Atomic_Weight_From, 
    Atomic_Weight_To. 
    

    如果只有一个值 Atomic_Weight_From Atomic_Weight_To 将包含相同的值。
    通过这种方式,您可以尽可能地保持表的干净,以及处理它所需的代码。