Sql 表示数学范围(在数据库、xml、json等中)的最佳数据模型是什么?

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

数学范围,例如:

大于或等于50且小于100(>=50&&<100)

小于10或大于40(40)

我一直在考虑如何在文件和数据库中表示数学范围,范围可能由非程序员输入,我需要保持输入简单,但另一方面,它还需要保持输入易于转换为数据,易于检查错误输入,例如:“100”似乎最简单,但我很难解析字符串获取数据,也需要考虑输入格式错误

我一直在考虑一些输入法,以>=50&&<100为例,采用键值形式:

1.使用1个字符串表示整个范围:

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