2017-06-16 82 views
0

我在VB.NET應用程序中創建了一個SQLite數據庫。帶有未知外鍵的SQLite關係插入

  1. varNames

    CREATE TABLE IF NOT EXISTS varNames(
        id  INTEGER PRIMARY KEY, 
        varName TEXT UNIQUE 
    ); 
    

    它看起來像這樣:

    ID | varName 
    --------------- 
    1 | var1 
    2 | var2 
    ... | ... 
    
  2. varValues

    CREATE TABLE IF NOT EXISTS varValues(
        timestamp INTEGER, 
        varValue FLOAT, 
        id  INTEGER, 
        FOREIGN KEY(id) REFERENCES varNames(id) ON DELETE CASCADE 
    ); 
    
    它超過2臺存儲的時間序列數據進行多重varName記錄

    它看起來像這樣:

    timestamp | varValue | id 
    ------------------------------ 
    1   | 1.0345 | 1 
    4   | 3.5643 | 1 
    1   | 7.7866 | 2 
    3   | 4.5668 | 2 
    ...  | ....  | ... 
    

第一個表包含varNameID。第二個包含每個varName的值作爲時間序列(每timestamp)。外鍵鏈接表。插入varNames看起來是這樣的:

INSERT OR REPLACE INTO varNames (
    varName 
) VALUES (
    @name 
); 

我插入值特定varName到第二個表是這樣的:

INSERT OR REPLACE INTO varValues (
    timestamp, 
    varValue, 
    id 
) VALUES (
    @timestamp, 
    @value, 
    (SELECT id FROM varNames WHERE varName = @name) 
); 

我不知道varNameID爲相應varValues記錄在插入時。這就是爲什麼我用:

(SELECT id FROM varNames WHERE varName = @name) 

看起來很慢,相比於ID直接尋址。如何將INSERT性能提高到第二個表中?

+0

取決於你如何做事......如果你的數據量很少,速度應該不會太慢。如果可能的話,你可以在你的.net代碼中存儲id的值,或者獲取[上一次插入的行ID](https://stackoverflow.com/questions/2127138/how-to-retrieve-the-last-autoincremented- ID-從-A-sqlite的表)。 –

+0

我想問的一個問題是爲什麼你有兩張桌子呢?第一個表(只有id和變量名)用於什麼目的?在第二個表中,什麼阻止你只是存儲變量名而不是ID? –

+0

@ChrisDunaway:好問題當我剛剛重讀這篇文章時,我也在問自己。我這樣做的原因是性能和數據庫文件大小。在50k數據點處有600個變量,我得到30m行。當我只使用一個表並重復使用每個變量的名稱而不是簡單的外鍵時,我的文件大小增長很大(在我的情況下,大小是3倍)。此外,這要比使用兩張表的應用程序更長時間... – JoP

回答

0

…將INSERT性能提高到第二個表中?

使用a transaction(優選組合多個INSERT):

BEGIN TRANSACTION; 

INSERT OR REPLACE INTO varValues (
    timestamp, 
    varValue, 
    id 
) VALUES (
    @timestamp, 
    @value, 
    (SELECT id FROM varNames WHERE varName = @name) 
); 

INSERT OR REPLACE INTO varValues (
    timestamp, 
    varValue, 
    id 
) VALUES (
    @timestamp, 
    @value, 
    (SELECT id FROM varNames WHERE varName = @name) 
); 

etc. ... 

END TRANSACTION; 

Related