我正在尝试将数据数组(或向量)存储在 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
和 position
array_of_points
表的一部分,因为它们是复合主键的一部分。
我目前拥有的唯一解决方案是从 foo
表中删除外键,但这不是一个好的解决方案,因为这意味着它现在可以保存任何值,即使它不实际上映射到 array_of_points
表中的数组。
有什么办法可以解决这个问题吗?或者也许有其他方法来存储数据以便这成为可能?
仅供引用,请不要建议我将数据存储在某种逗号/分号/任何分隔列表中,因为这是一个我不会考虑的更糟糕的选择。也不可能处理一些将存储在数据库中的更复杂的对象。
最佳答案
此模式无法处理一种特殊情况:无法存储大小为零的数组。 这在实践中可能不是一个问题,但它表明数据库没有完全规范化。
外键始终引用单个父记录。 因此,缺少的是每个数组都有一条记录的表。 实现这一点将产生如下模式:
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/