Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > Внешние ключи в InnoDB, могут ли быть проблемы?


Автор: Gwendolen 16.9.2022, 06:42
Возникли некоторые вопросы при миграции давно работающего проекта с MyISAM на InnoDB.

Есть множество таблиц с различными параметрами(обычно вариантов для выпадающих списков) вот такого вида: 

Код

CREATE TABLE `sls_type` (
  `type_id` int(11) NOT NULL,
  `language_id` int(11) NOT NULL,
  `name` varchar(32) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


ALTER TABLE `sls_type`
  ADD PRIMARY KEY (`type_id`,`language_id`),
  ADD KEY `language_id` (`language_id`);

ALTER TABLE `sls_type`
  MODIFY `type_id` int(11) NOT NULL AUTO_INCREMENT;


Они редактируются очень редко(преимущественно из админки) и используются во множестве других таблиц:
Код

CREATE TABLE `sls_information` (
  `information_id` int(11) NOT NULL,
  ...
  `type_id` int(11) DEFAULT NULL,
  ...
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

ALTER TABLE `sls_information`
  ADD PRIMARY KEY (`information_id`),
  ...
  ADD KEY `type_id` (`type_id`);

ALTER TABLE `sls_information`
  MODIFY `information_id` int(11) NOT NULL AUTO_INCREMENT;


Понятно что лучше переводы делать в отдельных таблицах. Но после добавления внешних ключей такого вида:

Код

ALTER TABLE `sls_type`
  ADD CONSTRAINT `sls_type_ibfk_1` FOREIGN KEY (`language_id`) REFERENCES `sls_language` (`language_id`);

ALTER TABLE `sls_information`
  ...
  ADD CONSTRAINT `sls_information_ibfk_3` FOREIGN KEY (`type_id`) REFERENCES `sls_type` (`type_id`),
  ...;



После беглого тестирования проблем не нашел и вроде всё устраивает. Если в таблицу `information` внесена ссылка на `type`, то из таблицы `type` я не могу удалить ни одного связанного преревода, даже если это не последний перевод для данного типа. Вообще-то это запрещается и логикой при редактировании, но я пытался удалить из БД напрямую.

Большого желания менять нет. Но пока происходит глобальный рефакторинг можно бы было(но не желательо) выделить недельку на изменение и тестирование в этой части.

Какие вообще могут поджидать проблемы если оставить подобную схему БД? Или все-таки это рабочий вариант?

P.S. Благодаря внешним ключам нашел много потерянных и даже немного несогласованных данных.

Автор: Akina 16.9.2022, 11:46
Да вполне себе рабочий вариант. Внешние ключи - средство как бы проверенное и временем, и кучей разработчиков.

Цитата(Gwendolen @  16.9.2022,  07:42 Найти цитируемый пост)
Какие вообще могут поджидать проблемы если оставить подобную схему БД?

Где транзакции, там и дедлоки.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)