Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Внешние ключи в InnoDB, могут ли быть проблемы? Не совсем красивая схема БД 
:(
    Опции темы
Gwendolen
  Дата 16.9.2022, 06:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 5.4.2005

Репутация: нет
Всего: 1



Возникли некоторые вопросы при миграции давно работающего проекта с 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. Благодаря внешним ключам нашел много потерянных и даже немного несогласованных данных.


Это сообщение отредактировал(а) Gwendolen - 16.9.2022, 06:51
--------------------
Наносите пользу и причиняйте добро!
PM MAIL   Вверх
Akina
Дата 16.9.2022, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



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

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

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


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0769 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.