我正在处理本机作为有理数提供的数据。我有一个漂亮的通用 C# 类,它可以在 C# 中精美地表示此数据,并允许转换为许多其他形式。不幸的是,当我转身想将它存储在 SQL 中时,我想到了几个解决方案,但没有一个是非常令人满意的。
这是一个例子。2/3
我拥有可以在 C#中new Rational<int>(2, 3)
轻松处理的原始值。我想到的将其存储在数据库中的选项如下:
就像一个小数/浮点数,即
0.66666667
各种精度和精确度的值=。 优点:这使我可以查询数据,例如找到 < 1 的值。 缺点:它失去了准确性,当我在 UI 中显示这个简单的值时,它很难看。存储为两个精确的整数字段,例如各种精度和精确度的 分子 =
2
、分母 = 。优点:这使我可以精确地表示原始值并在以后以最简单的形式显示它。 缺点:我现在有两个字段来表示这个值,并且查询现在变得复杂/效率较低,因为每个查询都必须执行算术运算,例如查找分子/分母 < 1。3
序列化为字符串数据,即
"2/3"
. 我将能够知道最大字符串长度并拥有一个可以容纳它的 varchar。 优点:我回到了一个领域,但有一个确切的代表。 缺点:查询几乎被破坏并支付序列化成本。#1 和 #2 的组合。 优点:轻松/高效地查询值的范围,并在 UI 中具有精确的值。 缺点: 三个字段(!?!)保存一份数据,必须保持多个表示同步,这会破坏 DRY
#1 和 #3 的组合。 优点:轻松/高效地查询值的范围,并在 UI 中具有精确的值。 缺点:回到两个字段来保存一份数据,必须保持多个表示同步,这会破坏 DRY,并且必须支付额外的序列化成本。
有没有人有另一种比这些更好的开箱即用解决方案?还有其他我没有考虑的事情吗?有没有一种相对简单的方法可以在我不知道的 SQL 中做到这一点?