【问题标题】:Store array in SQLite that is referenced in another table在另一个表中引用的 SQLite 中存储数组
【发布时间】:2014-05-02 18:46:55
【问题描述】:

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

这将很好地创建表,但是一旦您尝试对其执行查询,外键约束就会引发错误,因为它必须同时引用 array_of_points 表的 idposition,因为它们是一部分复合主键。

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

有没有办法解决这个问题?或者也许有一些其他的方式来存储数据,这样就可以了?

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

【问题讨论】:

    标签: arrays sqlite reference foreign-keys primary-key


    【解决方案1】:

    此架构无法处理一种特殊情况:无法存储大小为零的数组。 这在实践中可能不是一个问题,但它表明数据库没有完全规范化。

    外键总是引用单个父记录。 因此,缺少的是每个数组都有一条记录的表。 实现它会产生这样的架构:

    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。

    【讨论】:

    • 零大小数组不是问题,但感谢您提醒我。在允许存储空数据的情况下,我刚刚删除了NOT NULL 并将该字段设置为NULL,这将让我在读回它时知道它是空的。至于解决方案,这似乎正是我所需要的。必须为每个数组表维护两个表有点烦人,但除非有其他解决方案,否则我真的没有太多选择。
    • 我想我找到了一种方法来完成这项工作:我将有一个array 表来存储所有存储数组数据的表中每个数组的 ID。这样我只需要添加一个额外的表,并通过非常小的代码更改稍微更改外键和主键。非常感谢,这真的让我很头疼:)
    猜你喜欢
    • 1970-01-01
    • 2012-08-28
    • 2012-10-30
    • 1970-01-01
    • 2015-06-04
    • 1970-01-01
    • 2020-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多