4

フラットファイルから MySQL データベースにデータをロードし、外部キーを介してテーブル間の関係を作成する最速の方法は何ですか?

たとえば...次の形式のフラットファイルがあります。

[INDIVIDUAL]   [POP]  [MARKER]  [GENOTYPE]

"INDIVIDUAL1", "CEU", "rs55555","AA"  
"INDIVIDUAL1", "CEU", "rs535454","GA"  
"INDIVIDUAL1", "CEU", "rs555566","AT"  
"INDIVIDUAL1", "CEU", "rs12345","TT"  
...  
"INDIVIDUAL2", "JPT", "rs55555","AT"  

4 つのテーブルにロードする必要があります。

IND (id,fk_pop,name)  
POP (id,population)  
MARKER (id,rsid)  
GENOTYPE (id,fk_ind,fk_rsid,call)  

具体的には、スケールする方法で外部キーをどのように設定しますか? 数値は 1000 人以上の範囲にあり、それぞれが 100 万以上の遺伝子型を持っています。

4

3 に答える 3

9

これを行うには、複数のステップを踏む必要があります。

  1. あなたが持っているファイル形式と一致する一時テーブルにデータをロードします
  2. 他の挿入を行うクエリを作成し、一般的なテーブルを開始してから、結合を実行して FK 値を取得します。
于 2008-10-23T18:36:36.587 に答える
4

もっと簡単な方法があります。

まず、UNIQUE 制約が必要な列 (name、population、rsid) に UNIQUE 制約があることを確認します。

次に、次のようなものを使用します。

 LOAD DATA INFILE 'data.txt' IGNORE INTO TABLE POP FIELDS TERMINATED BY ','
    ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 LINES 
    (@name, population, @rsid, @call);
 LOAD DATA INFILE 'data.txt' IGNORE INTO TABLE MARKER FIELDS TERMINATED BY ',' 
    ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 LINES 
    (@name, @population, rsid, @call);
 LOAD DATA INFILE 'data.txt' IGNORE INTO TABLE IND FIELDS TERMINATED BY ',' 
    ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 LINES 
    (name, @population, @rsid, @call) 
    SET fk_pop = (SELECT id FROM POP WHERE population = @population);
 LOAD DATA INFILE 'data.txt' IGNORE INTO TABLE GENOTYPE FIELDS TERMINATED BY ',' 
    ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 LINES 
    (@name, @population, @rsid, call)
    SET fk_ind = (SELECT id FROM IND where name = @name),
    fk_rsid = (SELECT id FROM MARKER where rsid = @rsid);

列名ではなく変数を示すために @ が使用されていることに注意してください。最初の 2 つの LOAD DATA では、これらは単にデータを無視するために使用されています。2 番目の 2 では、外部キーの検索に使用されます。

あまり速くないかもしれません、気をつけてください:)。

于 2009-01-16T03:05:15.700 に答える
0

外部キーのないベーステーブルから始めることができます。次に、他のテーブルにデータを挿入するときに ID を検索します。

もう 1 つのアイデアは、フラット ファイル (INDIVIDUAL1、CEU など) の ID を GUID に置き換えることです。次に、それらを ID および外部キーとして直接使用します (これはパフォーマンスとタグ付けされていることに気付きました。これは最高の「パフォーマンス」を提供しない可能性があります)。

于 2008-11-01T08:56:12.653 に答える