Импорт данных в разные таблицы

dsmart
Дата: 10.01.2013 11:53:28
Нужна помощь! В базу MySql загружаю данные из разных источников через csv (базу использую как хранилище данных).
При этом данные из одного файла могут апдейтить сразу несколько талиц, условно в одну ФИО человека в другую место его работы, в третью акции в которых он участвовал (то есть отношение один ко многим).
Форматов загрузки файлов несколько.
Как в целом правильно организовать процесс загрузки? Брать один тип файла, апдейтить основную таблицы, потом связанные? Или связанные значения подгружать отдельным файлом? Как все сделать красивее и понятнее?
Akina
Дата: 10.01.2013 11:56:20
Разумнее - данные каждой таблицы в отдельном CVS-файле.
Насчёт красоты и понятности ничего сказать не могу.
dsmart
Дата: 10.01.2013 12:33:01
Тогда придется искать по текстовому полю? ID записи присваивается при инсерте в базу.
А так придется искать ID записи по ФИО. И потом в связанную таблицу инсертить ID и соответствующее ему значение. Боюсь тормозить сильно будет. В таблице около миллиона записей.
tanglir
Дата: 10.01.2013 12:35:43
dsmart
А так придется искать ID записи по ФИО.
откройте для себя last_insert_id()
правда, от загрузки ксв тогда придётся отказаться
tanglir
Дата: 10.01.2013 12:36:04
dsmart
В таблице около миллиона записей.
В таблице или в ксв?
Akina
Дата: 10.01.2013 13:20:17
dsmart
Тогда придется искать по текстовому полю? ID записи присваивается при инсерте в базу.
А куда ты денешься, если ID в исходных данных отсутствует?
Однако на самом деле импорт следует выполнять во временные таблицы, потом пачкой связанных запросов (возможно, в одной транзакции) переносить информацию в боевые таблицы, и при успехе - временные таблицы удалять либо чистить.
dsmart
Дата: 10.01.2013 13:21:10
tanglir
dsmart
А так придется искать ID записи по ФИО.
откройте для себя last_insert_id()
правда, от загрузки ксв тогда придётся отказаться


Не совсем понял как могу использовать последний ID? И что значит отказаться от загрузки?

В таблице миллион записей, в файле не больше 30 000 записей. Можно в таблицу еще добавить ID загрузки, тогда надо будет искать не по всему миллиону, а по загруженным 30 000. Но это было бы не совсем правильно, возможно, ктото уже был в базе и не инсертился в таблицу, соответственно его нужно искать по всей таблице.
tanglir
Дата: 10.01.2013 13:26:18
dsmart, вариант "всё на клиенте" (для ваших масштабов сойдёт):

начало_транзакции;
цикл:
забить первую запись в главную_таблицу;
получить ид вставленной записи;
забить подчинённые данные в остальные таблицы. используя полученный ид;
конец_цикла;
коммит;
dsmart
Дата: 10.01.2013 13:26:20
Akina согласен.
Просто если буду грузить из одного файла тогда буду сразу апдейтить две таблицы, и не надо будет искать значение. Но мне такой вариант не нравится. Пока примериваюсь как лучше сделать.
tanglir
Дата: 10.01.2013 13:26:37
tanglir
забить первуюочередную запись