Mysql 查询SQL中任意x处y值的XY数组对
我想建立一个产品数据库。每个产品的特征都描述为x值和相应y值的数组。 我想查询产品的某些特性 产品数据示例: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
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类型??)
| 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最好是可以插值相应的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