2014-05-02 68 views
2

我試圖在SQLite數據庫中存儲數據的數組(或向量),但我遇到了問題,試圖找到一個體面的方式來做到這一點。我發現在計算器上一些其他職位,我似乎無法找到了,裏面提到在表中存儲數據如下所示:將數組存儲在另一個表中引用的SQLite中

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和order by位置的一切:

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和因爲它們是組合主鍵的一部分,所以array_of_points表的position

我現在唯一的解決方案是從foo表中刪除外鍵,但這不是一個好的解決方案,因爲它意味着它現在可以保存任何值,即使它沒有實際映射到數組中array_of_points表。

有沒有辦法解決這個問題?或者,也許有其他方式來存儲數據,以便這是可能的?

就像一個供參考,請不要建議我存儲在某種逗號/分號/任何分隔列表的數據,因爲這是一個更糟糕的選擇,我不會考慮。對於將要存儲在數據庫中的一些更復雜的對象也是不可能的。

回答

2

該模式無法處理的一種特殊情況是:不可能存儲大小爲零的數組。 實際上這可能不是一個問題,但它表明數據庫沒有完全標準化。

外鍵始終引用單個父記錄。 因此,缺少的是每個數組都有單個記錄的表。 實施,這將導致在這樣的模式:

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的能力。

+0

零大小的數組不是問題,但感謝提醒我。在允許存儲空數據的情況下,我剛剛刪除了「NOT NULL」並將該字段設置爲「NULL」,這會讓我知道在讀取它爲空時的情況。 至於解決方案,這似乎就是我所需要的。這對於爲每個數組表格維護兩張表是有點煩人的,但除非有其他解決方案,否則我沒有太多選擇餘地。 – Shenjoku

+0

我想我想出了一個方法來實現這個工作:我將有一個'array'表,存儲所有存儲數組數據的表中的每個數組的ID。這樣我只需要添加一個額外的表,並稍微更改外部和主鍵,並對代碼進行細微更改。非常感謝,這真的救了我很多頭痛:) – Shenjoku

相關問題