MySQL: таблица "Payments" привязана к нескольким возможным таблицам "Service"
Я постараюсь быть кратким и ясным.
Я хочу, чтобы таблица "Платежи" была привязана к нескольким таблицам, представляющим различные типы услуг, предлагаемых компанией. Довольно просто добавить внешний ключ "Платеж" в каждую из таблиц услуг и связать их с первичным ключом в "Платежах", но проблема практическая:
Я хотел бы создать (Libre Office Base) форму, которая добавляет платеж. Но для этого потребуется не только выполнить INSERT в нескольких таблицах ("Платежи" для информации и заданная таблица "Сервис" для внешнего ключа), но и добавить первичный ключ во внешнюю таблицу до того, как сама форма создаст этот первичный ключ., Таким образом, этот вариант кажется вне.
Я попытался сделать это по-другому - положить внешний ключ "Сервис" в таблицу "Платежи" и вставить туда идентификаторы (первичные ключи) из других таблиц, но указанные первичные ключи являются простыми целыми числами и добавить, скажем, идентификатор ServiceA ID = 1. обманул бы базу данных, полагая, что объект ID = 1 из всех других таблиц также "оплачен". Я знаю, что мог бы различать идентификаторы между этими таблицами, делая их varchars, а не целыми числами, но тогда я не думаю, что есть способ сделать их автозаполнениями, верно?
Наконец, я подумал, что, возможно, поможет вариант "категория" - выберите тип услуги (например, "Хирургия", "Продажа лекарств", "Экзамен"), а затем введите один из идентификаторов. Это может дать мне возможность разделять идентичные номера в запросах. Однако это не решило бы проблему, заключающуюся в том, что попытка вставить ID = 40, скажем, из "Операций", в то время как в любой из других таблиц такого идентификатора не было, вызвала бы явную ошибку, нарушение отношения, поскольку база данных эта запись ведет в никуда.
Я действительно изо всех сил пытаюсь найти простое решение из этого беспорядка. Я думаю, что наиболее подходящим вариантом для меня было бы как-то сделать автозаполнение первичных ключей, которые отличаются в разных таблицах, но на этом этапе я приму любое предложение. Возможно ли вообще в Libre Office Base создать форму, которая бы как-то соответствовала тому, что я хочу?
2 ответа
Попробуйте использовать триггер, после того, как основной был вставлен, триггер будет вызван, и другая информация будет добавлена к другим таблицам.
Я думаю, что нашел способ сделать именно то, что мне нужно.
Во-первых, я создал таблицу с именем "For" только с одним полем - BIGINT ID с автоинкрементом. Затем я создал связь между этой таблицей и идентификаторами моих таблиц "служб" (теперь, очевидно, также BIGINT). При этом все они теперь имеют автоматически увеличивающиеся идентификаторы (внешний ключ от "For"), но между ними не повторяется ни один. Нет риска, что моя база данных будет перепутана с тем, к какой таблице принадлежит идентификатор.
Затем я создал таблицу под названием "PS" (для "Платежей и услуг"), которая будет выступать в качестве промежуточной таблицы в отношениях нескольких мульти. Я хочу, чтобы люди платили за многие услуги одним платежом, если они этого хотят, но и позволяли им платить за один сервис несколькими более мелкими платежами. Таким образом, в таблице "Для" есть поле для внешнего ключа от "Платежей" (идентификатор) и внешний ключ от "Для" (он же идентификаторы из Служб).
Возможно, это звучит как беспорядок, но я думаю, что это лучшее из возможных решений.
Теперь у меня возникли другие проблемы с формой "добавить платеж", которую я пытаюсь сделать, так что… я думаю, у вас еще один вопрос;)