Sql 表示数学范围(在数据库、xml、json等中)的最佳数据模型是什么?
数学范围,例如: 大于或等于50且小于100(>=50&&<100) 小于10或大于40(40) 我一直在考虑如何在文件和数据库中表示数学范围,范围可能由非程序员输入,我需要保持输入简单,但另一方面,它还需要保持输入易于转换为数据,易于检查错误输入,例如:“100”似乎最简单,但我很难解析字符串获取数据,也需要考虑输入格式错误 我一直在考虑一些输入法,以>=50&&<100为例,采用键值形式: 1.使用1个字符串表示整个范围:Sql 表示数学范围(在数据库、xml、json等中)的最佳数据模型是什么?,sql,xml,database,math,data-modeling,Sql,Xml,Database,Math,Data Modeling,数学范围,例如: 大于或等于50且小于100(>=50&&=50&& 真的 50 < 假的 100 5.使用“&&”或“| |”进行自动检测,例如:>=A和=50&&low\u end+大小写,当包含低端时,则为0,否则为1) 和(high_-end为null或col
<rangeInString>=50 && < 100</rangeInString>
=50&<100
2.分离两个字符串,一个表示下限,另一个表示上限,然后解析程序中的每个字符串:
<lowerBound> >=50 </lowerBound>
<upperBound> <100 </upperBound>
>=50
=
50
<
100
4.分开下限和上限,也分开符号,也分开包含相等条件的情况:
<lowerBound>
<sign> > </sign>
<isIncludeEqual>true</isIncludeEqual>
<data>50</data>
</lowerBound>
<upperBound>
<sign> < </sign>
<isIncludeEqual>false</isIncludeEqual>
<data>100</data>
</upperBound>
>
真的
50
<
假的
100
5.使用“&&”或“| |”进行自动检测,例如:>=A和=50&&=100 | |
真的
50
<
假的
100
6.使用字段“isAnd”来分隔>=50&&<100(真)和100(假),而不是使用字段符号“”:
真的
50
假的
100
真的
7.其他数据模型
我需要考虑一些事情:
1.非程序员易于输入
2.易于将数据转换或解析为程序
3.容易检查错误,例如,解析字符串增加了转换数据和检查错误格式的复杂性,也可能有其他错误格式,例如:100不应该是有效的,我可能允许通过输入符号使用“&&”或“| |”自动检测,但这可能会增加代码的复杂性
有人知道吗?这是一个很好的问题,Gordon建议的区间表示法和无穷大的给定字符的组合如何。这与单独的字段(或解析算法)相结合可以完成定义任何范围的任务 例如,范围
(3为什么要“编码”它?使用它既没有好处,也没有必要,也有一些麻烦
只需存储独占范围的结束值
low_end int,
high_end int,
您可以在SQL或应用程序代码中将这些原始值转换为可用的表达式。您不需要考虑包含值,因为低端“n独占”==“n包含1”和“n排他性”==“n包含+ 1”。
下面是一个SQL实现:
where (low_end is null or col > low_end)
and (high_end is null or col < high_end)
和更多代码:
where (low_end is null or col > low_end + case when low_inclusive then 0 else 1 end)
and (high_end is null or col < high_end - case when high_inclusive then 0 else 1 end)
式中(低端为空或col>low\u end+大小写,当包含低端时,则为0,否则为1)
和(high_-end为null或col
PostgreSQL不支持范围
表示形式如下所示:
[low, high)
[
或]
=包含在内
(
或)
=独占
无界看起来是这样的:[低值,无限]
专门针对您的选项:
为什么要用一种必须解析的格式来表示它呢?可以用一种代码可以解析的格式来存储它,但是如果需要用另一种编程语言来访问它呢
与1相同
正在接近,但需要将边界包含在包含&&或| |的范围对象中。此外,不需要元素,元素由“lower”和“upper”表示,可以用包含标志替换,如图4所示
不需要
不必要的抽象…它只是一个范围
那可能行得通
其他数据模型:
数据是结构化的,因此可以使用json、xml、关系型,甚至可以作为一组语义三元组使用。关于“[]”和“()”?例如“[0,1]”,表示从0到1的间隔,包括零但不包括一。GordonLinoff的注释称为间隔符号。间隔不包括“小于40或大于100”的示例。
where (low_end is null or col > low_end)
and (high_end is null or col < high_end)
low_end int,
low_inclusive boolean,
high_end int,
high_inclusive boolean,
where (low_end is null or col > low_end + case when low_inclusive then 0 else 1 end)
and (high_end is null or col < high_end - case when high_inclusive then 0 else 1 end)
[low, high)