2008-10-23 4 views
4

Каков самый быстрый способ загрузить данные из flatfiles в базу данных MySQL, а затем создать отношения между таблицами через внешние ключи?Загрузка плоских файлов в нормализованную базу данных 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" 

Что мне нужно загрузить в четыре таблицы:

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

В частности, каким образом один населяют внешние ключи таким образом, что масштабы? Цифры находятся в диапазоне 1000+ человек, каждый из которых имеет 1 миллион + генотипов.

+0

Спасибо за совет до сих пор ... хотя в настоящее время мне приходится управлять внешними ключами программно перед загрузкой – pufferfish 2008-11-01 17:28:26

ответ

4

Существует более простой способ.

Прежде всего, убедитесь, что у вас есть ограничение UNIQUE для тех столбцов, которые должны иметь один (имя, население, rsid).

Затем используйте что-то вроде следующего:

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); 

Примечание где @ используется для обозначения переменных, а не имена столбцов. В первых двух данных LOAD DATA они просто используются для игнорирования данных. Во втором 2 они используются для поиска внешних ключей.

Возможно, не очень быстро, ум :).

9

Я бы сделал многоступенчатый подход для этого.

  1. Загрузите данные во временную таблицу, которая сопрягает формат файла, который вы имеете
  2. писать запросы, чтобы сделать другие вставки, начиная с общих таблиц, а затем делать присоединяется, чтобы получить значения FK.
0

Вы можете начать с базовых таблиц без внешних ключей. Затем вы будете искать идентификаторы, когда вы вставляете данные в другие таблицы.

Другой идеей является то, что вы можете заменить идентификаторы в плоском файле (INDIVIDUAL1, CEU, ... и т. Д.) По идентификаторам GUID. а затем использовать их непосредственно как идентификаторы и внешние ключи (я заметил, что это отмеченная производительность, это может не дать лучшую «производительность»).

 Смежные вопросы

  • Нет связанных вопросов^_^