在我的表格中,我需要存储一个物理数量,可以作为数值或数字间隔给出。下表说明了这个想法:
------------------------------
Isotope_ID | Atomic_Weight
------------------------------
1 | 1.00784
2 | [6.938, 6.997]
... | ...
此表格不可接受,因为字段Atomic_Weight包含不同类型的值。在这种情况下,最佳做法是什么?
Edit1:有三种可能的方法来表示有关原子量的信息:
这三个子类型不能存储在一个字段中,因为这会违反1个规范化表单。这就是示例表不可接受的原因。 我将尝试更清楚地重申我的问题:在我的数据库中存储有关原子量的信息(可以在三种不同的子类型之一中给出)的可能方法是什么?
答案 0 :(得分:0)
我会选择一个包含三列的表格:
Isotope_ID,
Atomic_Weight_From,
Atomic_Weight_To.
如果只有一个值,Atomic_Weight_From
和Atomic_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子类型/子类型表。