【问题标题】:How to store data that can be either a numeric range or a numeric value?如何存储可以是数值范围或数值的数据?
【发布时间】:2016-06-10 16:29:25
【问题描述】:

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

------------------------------
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

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

【问题讨论】:

  • 1.请详细说明“这些案例”的含义。什么情况?点vs区间?多个非原始“类型”编码为字符串? 2. 谁/什么“不可接受”?数据库管理系统?关系模型?你的编程标准? PS你不使用[1.00874,1.00874]的原因是什么?
  • 您确定要range吗?在给定的情况下,您不会有一组未知大小的离散值吗?
  • @philipxy 感谢您的提问。我试图在 Edit1 中扩展它们
  • @Magoo 我不想要一个范围,因为设计应该适用于不同的 DBMS。我想存储可以以不同类型给出的数据。请看编辑1
  • 关于“三个子类型不能存储在一个字段中”请看我答案的中间部分。首先,您在想象一些您认为不同的“类型”,然后您说您不能将它们放在一列中,因为一列只有一种类型。那么想象一下(超级)“类型”是所有这些值的集合。无论哪种方式,您都必须将类型或类型的值编码作为 DBMS 中可用值的子行,因为各个(子)“类型”并非所有 DBMS 原始类型。

标签: database database-design normalization database-normalization


【解决方案1】:

数值或数值区间

在间隔的情况下,您可以将单个值 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 子类型/子类型表。

【讨论】:

  • 我认为每个子类型都有一个表格的模式可以解决我的问题。但是我如何进行查询以获取给定同位素的原子量?通过在 weight_single 和 weight_interval 中搜索?
  • 您希望结果采用什么格式? “一个”原子量有时是一个值,有时是一个区间。同位素数本质上是重量的替代物。只需携带同位素数,直到您真正需要他们的重量;对于与 Weight_single 匹配的那些,这将是一个单一权重的东西,而对于那些与 Weight_interval 匹配的那些,这将是一个区间权重的东西。我建议你尝试一个例子。
【解决方案2】:

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

Isotope_ID, 
Atomic_Weight_From, 
Atomic_Weight_To. 

如果只有一个值,Atomic_Weight_FromAtomic_Weight_To 将包含相同的值。
这样,您的表格以及需要处理它的代码都尽可能保持清洁。

【讨论】:

  • 感谢您的回答,但这不适用于我的情况。对不起,我在陈述我的问题时不是很清楚。请看编辑1
猜你喜欢
  • 2017-09-20
  • 2010-12-21
  • 2022-10-14
  • 1970-01-01
  • 1970-01-01
  • 2015-11-08
  • 1970-01-01
  • 2015-02-17
  • 1970-01-01
相关资源
最近更新 更多