У меня есть 5 текстовых полей, которые я хочу импортировать в базу данных MySQL/MariaDB. Но есть две проблемы:MySQL: использование естественного первичного индекса или добавление суррогата при указании таблиц
(1) Файлы довольно большие: 0,5 ГБ до 10 ГБ
(2) Все соответствующие клавиши имеют 40 символов
Point (1) я должен принять, как это и я не могу его изменить. Пункт 2 - мое беспокойство. В Интернете есть много предложений. Например, чтобы использовать перечисление для varchar или использовать числовые суррогаты. Нет необходимости добавлять суррогатный ключ к таблице. Но тот же самый суррогатный ключ должен быть добавлен к другим таблицам. И это тот момент, когда я застрял.
Здесь конкретная информация о файлах/таблицах:
таблица счета имеет 3 столбцов и 20 Mio строк:
- invoice_id (первичный ключ) с различными значениями = число строки
- praxis_id с 4 000 отличными значениями patient_id с 4 Mio отдельные значения все столбцы CHAR (40) и имеют фиксированную длину 40.
таблице диагностики имеет 3 столбцов и 25 строк Mio:
- invoice_id CHAR (40) 1.4 Мио отличается идентификатор
- diagnose_type
- diagnose_code
таблица пациент имеет 5 колонок с 5 рядами Mio:
- patient_id CHAR (40) не уникально (4 Mio отличается pat_id)
- praxis_id CHAR (40)
- год рождения, пол и т.д.
Например, я хочу присоединиться к счету с диагнозом и пациентом. Имеет смысл индексировать ключи. Одним из способов было бы определить invoice.invoice_id как первичный ключ, а для всех остальных ключей в счет-фактуре таблицы я бы добавил индекс. То же самое с таблицей диагностики (invoice_id с INDEX) и пациентом (patient_id как первичный ключ).
Проблема заключается в том, что потребовалось много времени, чтобы определить invoice.invoice_id в качестве первичного ключа с помощью:
ALTER TABLE invoice_id ADD PRIMARY KEY(invoice_id);
Через час я убил процесс. Я думаю, что одна из проблем производительности возникает из вида типа данных invoice_id в таблице счетов. Одной из идей может быть добавление автоинкрементного суррогатного ключа invoice_id_surr при загрузке текстового файла. Но, тем не менее, проблема остается, если я хочу присоединиться к диагностике таблицы, так как мне нужно присоединиться к invoice_id диагностики таблицы, которая не имеет суррогатного ключа invoice_id_surr в качестве внешнего ключа. Я мог бы добавить индекс для диагностики.invoice_id, но затем я теряю преимущество наличия суррогатного ключа в счете-фактуре.
Мне будет интересна стратегия, как справиться с этой проблемой: несколько уже существующих таблиц, которые могут быть объединены вместе, но ключи CHAR (40) и не имеют индекса.
Спасибо за помощь.
UPDATE 1: спецификация Таблица
- клавиши имеют 40 символов [0-9] [AZ]
- Это таблицы, которые не будут меняться больше (не вкладышами)
-- invoice_id is primary key (unique)
-- patient_id and praxis id for foreign key and not unique in this table
CREATE TABLE invoice (
invoice_id CHAR(40) DEFAULT NULL
, praxis_id CHAR(40) DEFAULT NULL
, patient_id CHAR(40) DEFAULT NULL
, PRIMARY KEY (invoice_id2)
) ENGINE = InnoDB
;
LOAD DATA LOCAL INFILE 'C:/data/invoice.txt'
INTO TABLE invoice
FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES
;
-- invoice_id is not unique in this table
CREATE TABLE diagnose (
invoice_id CHAR(40) DEFAULT NULL
, diagnose_katalog VARCHAR(20) DEFAULT NULL
, diagnose_code VARCHAR(20) DEFAULT NULL
) ENGINE = InnoDB
;
-- patient_id is not unique in this table since since patient may change praxis
CREATE TABLE patient (
patient_id CHAR(40) DEFAULT NULL
, praxis_id CHAR(40) DEFAULT NULL
, sex CHAR(1) DEFAULT NULL
, birth_year SMALLINT UNSIGNED DEFAULT NULL
, zip_code VARCHAR(20) DEFAULT NULL
) ENGINE = InnoDB
;
@zgguv Спасибо за ответ. Я не прояснился. С «заданными» или «существующими» таблицами я имею в виду, что файл таблиц был экспортирован из внешней базы данных в виде текстовых файлов, и я не могу их изменить. Я не знаю, почему они использовали строки с 40 символами без смысла в качестве ключа вместо числового. Возможно, я ошибался, чтобы назвать этот ключ естественным (я назвал его так, потому что он был доставлен). Таблица ** пациент ** не имеет уникального _patient_id_, поскольку он имеет историзированную информацию о пациенте. Чтобы сделать это простым, забудьте ** ** таблицу пациента и посмотрите только на ** счет-фактуру ** и ** диагноз ** (отношение 1: n). (продолжение) – giordano
@zgguv (продолжение) Нет необходимости добавлять числовой суррогатный ключ _invoice_ind2_ в ** счет **. Но этот суррогатный ключ также должен быть добавлен к ** диалогу ** как иностранному ключу, чтобы иметь возможность присоединиться к ** счету **. _invoice_id2_ = ** диагностировать **. _invoice_id2_. Поэтому я должен сначала добавить столбец ** диагноз **. _invoice_id2_ и 'update diagnose, invoice SET diagnose.invoice_id2 = invoice.invoice_id2 WHERE diagnose.invoice_id = invoice.invoice_id'. Я могу это сделать, но я должен добавить индекс для ** диагностики **. _invoice_id_ и ** диагностировать **. _invoice_id_. Итак, почему бы не использовать напрямую индексированный invoice_id для соединений? – giordano
Это проблема барона Мюнхгаузена: выйти из моря он натягивает собственные волосы. Чтобы избежать строки в качестве ключа для объединений, я должен выполнять объединения с этими строками. – giordano