Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 查询SQL中任意x处y值的XY数组对_Mysql_Sql_Postgresql_Database Design_Normalization - Fatal编程技术网

Mysql 查询SQL中任意x处y值的XY数组对

Mysql 查询SQL中任意x处y值的XY数组对,mysql,sql,postgresql,database-design,normalization,Mysql,Sql,Postgresql,Database Design,Normalization,我想建立一个产品数据库。每个产品的特征都描述为x值和相应y值的数组。 我想查询产品的某些特性 产品数据示例: ProductA_x = [10, 20, 30, 40, 50] ProductA_y = [2, 10, 30, 43, 49] ProductB_x = [11, 22, 33, 44, 55, 66] ProductB_y = [13, 20, 42, 35, 28, 21] 现在我想得到一个y31和31

我想建立一个产品数据库。每个产品的特征都描述为x值和相应y值的数组。 我想查询产品的某些特性

产品数据示例:

ProductA_x = [10, 20, 30, 40, 50]
ProductA_y = [2, 10, 30, 43, 49]

ProductB_x = [11, 22, 33, 44, 55, 66]
ProductB_y = [13, 20, 42, 35, 28, 21]
现在我想得到一个y<35@x=31的产品列表。 在示例数据案例中,我应该得到ProductA

  • 如果我使用MySQL,那么用什么好的方法来定义表 在SQL级别实现此查询
  • 如果我可以使用PostgreSQL,会不会变得更容易?(使用 数组或JSON类型??)
有人建议我做一个表格,为x范围指定xy对。第一个数据用于范围x[0]到x[1],下一个数据用于范围x[1]到x[2]。像这样的

| ProductID | x1 | x2 | y1 | y2 |
| --------- | -- | -- | -- | -- |
| 1 | 10 | 20 | 2 | 10 |
| 1 | 20 | 30 | 10 | 30 |
| 1 | 30 | 40 | 30 | 43 |
| 1 | 40 | 50 | 43 | 49 |
| 2 | 11 | 22 | 33 | 44 |
| 2 | 22 | 33 | 20 | 42 |
| 2 | 33 | 44 | 42 | 35 |
| 2 | 44 | 55 | 35 | 28 |
| 2 | 55 | 66 | 28 | 21 |
然后我可以查询(x1>31和31 这个解决方案还不错,但我想知道是否有更聪明的方法

请注意,x阵列保证是增量的,但不同的产品会有不同的起始x值、步长和点数。要搜索的x值在x数组中可能不作为精确值存在。 实际x和y阵列的长度大约为2000。我预计我会有大约10000种产品


最好是可以插值相应的y值,但可以在最接近的x值处搜索y值。

由于每个x恰好对应一个y,因此经典关系数据库上的sane表定义为:

CREATE TABLE product (id serial not null unique, sku text primary key, ....);
CREATE TABLE product_xy (product_id int not null references product(id),
                         x int not null,
                         y int not null,
                         primary key(product_id, x));
这将使您的查询在所有情况下都易于管理

在PostgreSQL 9.3上,您可以使用一个横向子查询来有效地使用数组,但我认为这并不比从关系设计开始容易。在PostgreSQL中,您希望将信息存储在数组中的唯一情况是,在x数组中,顺序是否重要。由于以下数组组合在语义上不相同,因此设计变得稍微复杂一些:

 array[1, 2, 3] x
 array[4, 5, 6] y

如果需要区分,则使用PostgreSQL中基于数组的解决方案(注意,在这两种情况下,相同的x值对应相同的y值,但对的顺序不同)。否则,请使用标准的关系设计。如果必须这样做,那么更好的选择是使用二维xy阵列,该阵列类似于:

 array[
    array[1, 2, 3],
    array[4, 5, 6]
 ] xy
然后,您可以使用函数作为一个整体处理数组中的这些对,但问题是,在这种情况下,xy表示特定域中的单个原子值,在这两个维度中,有序性都很重要,因此可以立即处理该值。换句话说,如果有序性在两个维度上都很重要,那么域中只有一个值,因此这不违反第一范式。若任意维度上的有序性都无关紧要,那个么它确实违反了第一范式

 array[
    array[1, 2, 3],
    array[4, 5, 6]
 ] xy