0
VB.NETアプリケーションでSQLiteデータベースを作成しました。外部キーが不明なSQLiteリレーショナルINSERT
表
varNames
:CREATE TABLE IF NOT EXISTS varNames( id INTEGER PRIMARY KEY, varName TEXT UNIQUE );
それは次のようになります。
ID | varName --------------- 1 | var1 2 | var2 ... | ...
表
varValues
:
これは、2つのテーブルの上に複数のためCREATE TABLE IF NOT EXISTS varValues( timestamp INTEGER, varValue FLOAT, id INTEGER, FOREIGN KEY(id) REFERENCES varNames(id) ON DELETE CASCADE );
varName
レコードを時系列データを格納しますそれは次のようになります。
timestamp | varValue | id ------------------------------ 1 | 1.0345 | 1 4 | 3.5643 | 1 1 | 7.7866 | 2 3 | 4.5668 | 2 ... | .... | ...
最初の表は、ID
とvarName
が含まれています。 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番目のテーブルに改善できますか?
あなたのやり方によって異なります...データ量が少ない場合は、遅くするべきではありません。可能であれば、あなたの.netコードにidの値を格納するか、[最後に挿入された行ID]を取得することができます(https://stackoverflow.com/questions/2127138/how-to-retrieve-the-last-autoincremented- id-from-a-sqlite-table)を参照してください。 –
最初に2つのテーブルがあるのはなぜですか?最初のテーブル(IDと変数名のみ)はどのような目的に役立ちますか? 2番目のテーブルでは、idの代わりに変数名を格納するのを妨げるのは何ですか? –
@ChrisDunaway:良い質問私はこのスレッドをもう一度読んだときに私は自分自身にも尋ねていました。私がこれを行う理由は、パフォーマンスとDBファイルのサイズです。 50kデータポイントで600個の変数を使用すると、30mの行が得られます。私が1つのテーブルだけを使用し、単純な外部キーの代わりに各変数の名前を何度も何度も繰り返していると、ファイルサイズが非常に大きくなります(私の場合は3倍のサイズ)。さらに、これは2つのテーブルを持つapporachよりも長くかかります... – JoP