gpt4 book ai didi

arrays - 将数组存储在另一个表中引用的SQLite中

转载 作者:行者123 更新时间:2023-12-03 17:53:46 25 4
gpt4 key购买 nike

我正在尝试在SQLite数据库中存储数据的数组(或向量),但是在尝试找到一种体面的方法时遇到了问题。我在StackOverflow上找到了其他帖子,似乎再也找不到了,其中提到将数据存储在如下表中:

CREATE TABLE array_of_points
(
id integer NOT NULL,
position integer NOT NULL,
x integer NOT NULL,
y integer NOT NULL,
PRIMARY KEY (id, position)
);


因此,要存储单个数组的所有数据,您可以将每个项目插入相同的ID下,并只需增加位置即可。因此,例如,要插入具有三个值的数组,将类似于:

INSERT INTO array_of_points VALUES (0, 0, 1, 1);
INSERT INTO array_of_points VALUES (0, 1, 2, 2);
INSERT INTO array_of_points VALUES (0, 2, 3, 3);


然后,要检索值,您将选择所有具有相同ID和按位置顺序排序的内容:

SELECT x,y FROM array_of_points WHERE id = 0 ORDER BY position;


这一切都很棒,而且效果很好,但是我现在遇到了一个问题,我不知道如何在另一个表中引用数组。例如,我想执行以下操作:

CREATE TABLE foo
(
id integer NOT NULL,
array_id integer NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (array_id) REFERENCES array_of_points (id)
);


这样可以很好地创建表,但是一旦您尝试对其执行查询,外键约束就会引发错误,因为它必须同时引用 id表的 positionarray_of_points,因为它们是组合的一部分首要的关键。

我目前唯一的解决方案是仅从 foo表中删除外键,但这不是一个好的解决方案,因为这意味着即使实际上未映射到<中的数组,它现在也可以保存任何值。 cc>表。

有什么办法可以解决此问题?或者,也许还有其他方法可以存储数据,从而做到这一点?

就像FYI一样,请不要建议我将数据存储在某种逗号/分号/任何定界列表中,因为这是我不考虑的更糟糕的选择。也将无法处理一些将要存储在数据库中的更复杂的对象。

最佳答案

这种模式无法处理一种特殊情况:无法存储大小为零的数组。
实际上,这可能不是一个问题,但是它表明数据库尚未完全规范化。

外键始终引用单个父记录。
因此,缺少的是一个表,该表对每个数组只有一条记录。
实现这一点将导致如下所示的模式:

CREATE TABLE array
(
id integer PRIMARY KEY
-- no other properties
);
CREATE TABLE array_points
(
array_id integer REFERENCES array(id),
position integer,
x, y, [...],
PRIMARY KEY (array_id, position)
) WITHOUT ROWID; -- see http://www.sqlite.org/withoutrowid.html
CREATE TABLE foo
(
[...],
array_id integer REFERENCES array(id)
);


额外的表需要进行更多的管理,但是现在您可以通过自动递增生成阵列ID。

关于arrays - 将数组存储在另一个表中引用的SQLite中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23434942/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com