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

标签 arrays sqlite reference foreign-keys primary-key

我正在尝试将数据数组(或向量)存储在 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)
);

这将很好地创建表,但是一旦您尝试对其执行查询,外键约束就会抛出错误,因为它必须引用 idposition 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/

相关文章:

android - 如何在QT上将SQLite导出到apk?

C#引用成员变量

c - 为什么复合赋值或迭代运算符不能处理取消引用的指针

python - 如何 : (1) making a copy of a numpy array, (2) 修改此副本,以及 (3) 返回修改后的副本

python - 如何在Python中的特定数组索引处将2个列表拼接在一起

php - PHP中 explode 两次的更好方法

java - 用于在java桌面应用程序中存储字符串的本地数据库,当前使用MongoDB

android - 如何在 Android Sqlite 中进行查询以拉丁顺序返回

c# - 在 C# 中列出 <int>

C++:为什么我们不能引用引用或引用数组?