2017-06-16 12 views
0

VB.NETアプリケーションでSQLiteデータベースを作成しました。外部キーが不明なSQLiteリレーショナルINSERT

  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 
    ...  | ....  | ... 
    

最初の表は、IDvarNameが含まれています。 2番目の値には、それぞれ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) 
); 

私にはわからない対応varValuesレコードのvarNameさんID挿入時に私が使用する理由はここにある:

(SELECT id FROM varNames WHERE varName = @name) 

は直接IDで取り組むに比べて遅いようです。どのようにしてINSERTのパフォーマンスを2番目のテーブルに改善できますか?

+0

あなたのやり方によって異なります...データ量が少ない場合は、遅くするべきではありません。可能であれば、あなたの.netコードにidの値を格納するか、[最後に挿入された行ID]を取得することができます(https://stackoverflow.com/questions/2127138/how-to-retrieve-the-last-autoincremented- id-from-a-sqlite-table)を参照してください。 –

+0

最初に2つのテーブルがあるのはなぜですか?最初のテーブル(IDと変数名のみ)はどのような目的に役立ちますか? 2番目のテーブルでは、idの代わりに変数名を格納するのを妨げるのは何ですか? –

+0

@ChrisDunaway:良い質問私はこのスレッドをもう一度読んだときに私は自分自身にも尋ねていました。私がこれを行う理由は、パフォーマンスとDBファイルのサイズです。 50kデータポイントで600個の変数を使用すると、30mの行が得られます。私が1つのテーブルだけを使用し、単純な外部キーの代わりに各変数の名前を何度も何度も繰り返していると、ファイルサイズが非常に大きくなります(私の場合は3倍のサイズ)。さらに、これは2つのテーブルを持つapporachよりも長くかかります... – JoP

答えて

0

… INSERTのパフォーマンスを2番目のテーブルに改善しますか?

使用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

関連する問題