Необходимо загружать данные из одного файла с 100 000 + записями в несколько таблиц в MySQL, поддерживая отношения, определенные в файле/таблицах; что означает, что отношения уже совпадают. Решение должно работать с последней версией MySQL и должно использовать движок InnoDB; MyISAM не поддерживает внешние ключи.
Я совершенно новичок в использовании интеграции данных Pentaho (aka Kettle), и любые указатели будут оценены.
Я могу добавить, что это требование, чтобы ограничения внешнего ключа НЕ были отключены. Поскольку я понимаю, что если что-то не так с ссылочной целостностью базы данных, MySQL не будет проверять ссылочную целостность, когда ограничения внешнего ключа снова включены. ИСТОЧНИК: 5.1.4. Системные переменные сервера - foreign_key_checks
Все подходы должны включать некоторые из валидации и стратегии отката, если вставка не выполняется или не поддерживает ссылочную целостность.
Опять же, совершенно новый для этого, и прилагаю все усилия, чтобы предоставить как можно больше информации, если у вас есть какие-либо вопросы или просьба о разъяснении - просто дайте мне знать.
Если вы можете опубликовать XML из файлов kjb и ktr (заданий/преобразований), которые будут SUPER. Можете даже выследить каждый комментарий/ответ, который вы делали где угодно, и проголосуйте за них...:-)... действительно, мне очень важно найти ответ для этого.
Спасибо!
ДАННЫЕ ОБРАЗЦА: Чтобы лучше разобраться с примером, допустим, что я пытаюсь загрузить файл, содержащий имя сотрудника, офисы, которые они занимали в прошлом, и их историю заданий, разделенных вкладкой.
Файл:
EmployeeName<tab>OfficeHistory<tab>JobLevelHistory
John Smith<tab>501<tab>Engineer
John Smith<tab>601<tab>Senior Engineer
John Smith<tab>701<tab>Manager
Alex Button<tab>601<tab>Senior Assistant
Alex Button<tab>454<tab>Manager
ПРИМЕЧАНИЕ. База данных с одной таблицей полностью нормализована (насколько может быть одна таблица) - и, например, в случае с "Джоном Смитом" есть только один Джон Смит; то есть нет дубликатов, которые могли бы привести к конфликтам в ссылочной целостности.
Схема базы данных MyOffice
имеет следующие таблицы:
Employee (nId, name)
Office (nId, number)
JobTitle (nId, titleName)
Employee2Office (nEmpID, nOfficeId)
Employee2JobTitle (nEmpId, nJobTitleID)
Итак, в этом случае. таблицы должны выглядеть так:
Employee
1 John Smith
2 Alex Button
Office
1 501
2 601
3 701
4 454
JobTitle
1 Engineer
2 Senior Engineer
3 Manager
4 Senior Assistant
Employee2Office
1 1
1 2
1 3
2 2
2 4
Employee2JobTitle
1 1
1 2
1 3
2 4
2 3
Здесь MySQL DDL для создания базы данных и таблиц:
create database MyOffice2;
use MyOffice2;
CREATE TABLE Employee (
id MEDIUMINT NOT NULL AUTO_INCREMENT,
name CHAR(50) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB;
CREATE TABLE Office (
id MEDIUMINT NOT NULL AUTO_INCREMENT,
office_number INT NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB;
CREATE TABLE JobTitle (
id MEDIUMINT NOT NULL AUTO_INCREMENT,
title CHAR(30) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB;
CREATE TABLE Employee2JobTitle (
employee_id MEDIUMINT NOT NULL,
job_title_id MEDIUMINT NOT NULL,
FOREIGN KEY (employee_id) REFERENCES Employee(id),
FOREIGN KEY (job_title_id) REFERENCES JobTitle(id),
PRIMARY KEY (employee_id, job_title_id)
) ENGINE=InnoDB;
CREATE TABLE Employee2Office (
employee_id MEDIUMINT NOT NULL,
office_id MEDIUMINT NOT NULL,
FOREIGN KEY (employee_id) REFERENCES Employee(id),
FOREIGN KEY (office_id) REFERENCES Office(id),
PRIMARY KEY (employee_id, office_id)
) ENGINE=InnoDB;
Мои заметки в ответе на выбранный ответ:
PREP:
- (a) Используйте образцы данных, создайте CSV, изменив
<TAB>
на запятую. - (b) Установите MySQL и создайте образец базы данных, используя образец MySQL DDL
- (c) Установите Kettle (он основан на Java и будет запускаться на всех, что запускает Java)
- (d) Загрузите файл KTR
Поток данных по шагу: (Мои заметки)
- Откройте KTR файл в чайнике и дважды щелкните "CSV файл" и перейдите к создаваемому CSV файлу. Разделитель уже должен быть установлен в запятую. Затем нажмите OKAY.
- Дважды нажмите "Вставить сотрудников" и выберите соединитель БД, затем следуйте этим указаниям в Создание нового подключения к базе данных