Настройка поля в таблице для хранения данных, относящихся к двум внешним ключам, и нумерация

У меня есть вопрос, связанный с настройкой третьей таблицы (таблица Repair_Parts) со следующей структурой:

Часть Таблица

Part_id (INT, без знака, автоинкремент) — первичный ключ

Part_name (VARCHAR(50)) – уникальный

Часть_описание (ТЕКСТ)

Исправить таблицу

Repair_id (INT, без знака, автоинкремент) — первичный ключ

Repair_name (VARCHAR(50)) – уникальный

Repair_descrip (ТЕКСТ)

Таблица Repair_Parts

Repair_id (внешний ключ — относится к полю Repair_id в таблице восстановления)

Part_id (внешний ключ — относится к полю Part_id таблицы частей)

Repair_Part_Item# — нумерация на основе количества записей в поле Part_id, связанных с конкретным Repair_id (используется для хранения данных о деталях, связанных с ремонтом) — я хочу, чтобы нумерация этого поля начиналась с «1» для каждого другого repair_id.

Вопрос

Например, скажем, программа php позволяет пользователю создавать инструкции по ремонту автомобиля. Пользователь указывает, что ремонт является «Проверка батареи» (данные вставляются в таблицу ремонта в поле Repair_name (VARCHAR(50)) и краткое описание ремонта (вставляется данные в таблицу ремонта в поле Repair_descrip ( ТЕКСТ)) Пользователь также может указать конкретные детали, участвующие в ремонте «Проверка аккумулятора», которых может быть одна или несколько, но в данном случае это только 2 разные детали, «Генератор» и «Аккумулятор». В другой записи пользователь указывает три детали для другого ремонта.

Как можно создать эту таблицу Repair_Parts в phpMyAdmin или MySQL, чтобы база данных отслеживала конкретные части, необходимые для восстановления? Какой двигатель следует использовать? MyISAM или INNODB?

Из того, что я читал о нормализации баз данных, у меня, кажется, есть правильный способ структурировать свои таблицы, но я не могу понять, как заставить поле Repair_Part_Item# хранить данные так, как я хочу. В частности, если предположить, что я разбил свои таблицы и их поля приемлемым образом, как мне заставить поле Repair_Part_Item# начинать нумерацию с 1 для каждой отдельной записи в поле Repair_id и подсчитывать каждую строку с одним и тем же Repair_id с помощью другой Part_id (и запретить повторяющиеся строки с одинаковыми Repair_id и Part_id)?

Из того, что я читал о нормализации, кажется, что это правильный способ структурировать мои таблицы, но я не могу понять, как сделать так, чтобы поле Repair_Part_Item# работало правильно.

Я относительный новичок в MySQL и PHP, и я просто пытаюсь настроить базы данных, прежде чем переходить к стороне уравнения PHP.


person Jay C. Besch    schedule 23.12.2011    source источник


Ответы (1)


Если я правильно понял, вы хотите иметь определенное поле, которое генерирует последовательность, начинающуюся с 1, на основе текущего Repair_id. Эта функция лучше всего достигается с помощью функции механизма MyISAM, где вы создаете составной первичный ключ ((Repair_id, id) с id равным auto_increment), однако таблицы MyISAM молча игнорируют отношения внешних ключей, поэтому не будет каскадных удалений или обновлений. InnoDB поддерживает ограничения внешнего ключа, но не поддерживает генерацию auto_increment так же, как это делает MyISAM. Лучшее, что вы можете сделать, это создать триггер, который будет генерировать порядковый номер, увеличивающийся на 1 на основе текущего Repair_id.

DELIMITER $$

CREATE TRIGGER `your_trigger_name` AFTER INSERT ON `your_table_name` 
FOR EACH ROW BEGIN 

SET new.Repair_Part_Item = (SELECT IF(ISNULL(Repair_Pair_Item, 1, MAX(Repair_Part_Item) + 1) FROM your_table_name WHERE Repair_id = new.Repair_id);

END 

DELIMITER ;
person N.B.    schedule 23.12.2011
comment
Спасибо за ответ. Итак, какого типа будут поля repair_id и part_id? ИНТ? ВАРЧАР? или это все равно? Извините, если это должно быть очевидно для меня. Я новичок в этом. - person Jay C. Besch; 23.12.2011
comment
FK всегда должны быть тем типом, на который они указывают. Поэтому, если ваш part_id указывает на parts.id, он должен быть того же типа и длины отображения, что и parts.id. Для краткости используйте целые числа для своих таблиц. - person N.B.; 23.12.2011
comment
Имя триггера — любое, которое вы выберете. Имейте в виду, что у меня, скорее всего, есть ошибки в синтаксисе SQL, я разместил его просто как ссылку, чтобы вы могли увидеть, как вы будете создавать один такой триггер. Идея состоит в том, что вы увеличиваете число Repair_Part_Item на основе значения Repair_id. Если Repair_Part_Item равно NULL (или нулю, я не знаю, что вы указали для значения по умолчанию для вашего столбца), то это первый элемент последовательности (номер 1). Это все для логики - реализация может быть отключена из-за того, что я не тестировал, правильно ли я написал триггер :) - person N.B.; 23.12.2011
comment
Большое спасибо. Думаю, у меня получилось, и вы мне очень помогли. Я опубликую синтаксис, как только я заставлю его работать - person Jay C. Besch; 23.12.2011
comment
Я нашел и другое решение. Я могу использовать форму PHP для ввода информации пользователями и настроить код PHP для подсчета количества записей для указанного количества деталей, необходимых для ремонта, и присвоить номер каждой детали, необходимой для ремонта (количество), а затем это назначенное числовое значение передается в поле Repair_Part_Item в таблице Repair_Parts в базе данных MySQL при вводе или обновлении. Это исключает изменение базы данных с тем же результатом. - person Jay C. Besch; 07.01.2012