один и тот же внешний ключ для двух разных первичных ключей

0

моя проблема в том, что я не знаю, и я не могу понять, возможно ли иметь два разных первичных ключа, ссылающихся на один и тот же ключ foreighn. Чтобы быть более конкретным, у меня есть три таблицы. Первая таблица называется персоналом с атрибутами: id fname lname password. Вторая таблица называется учеником с атрибутами: id fname lname password role и, наконец, третья таблица, которая называется сообщением, и имеет 4 атрибута: id text date user_fk и я хочу, чтобы два первичных ключа ссылались на ключ foreighn. В phpmyadmin довольно легко, и я это сделал. Проблема в том, что когда я хочу ввести новую строку, база данных, я полагаю, не может понять, является ли первичный ключ из таблицы сотрудников или студента. Сообщение, которое я получаю: #1452 - Cannot add or update a child row: a foreign key constraint fails ( дисс . Сообщение , CONSTRAINT student_fk FOREIGN KEY ( user_fk ) REFERENCES студент ( studentid )). Поэтому мой вопрос: совершенно ли неправильно, что я хочу делать? Может быть, лучше создать, например, другую таблицу, в которой будут храниться только ключи foreighn? Или ошибка где-то еще, что я не могу ее найти? Спасибо!

  • 0
    почему бы не создать 2 внешних ключа? и для ошибки значение должно существовать в таблицах персонала и ученика (если это правда, что DBM принял их оба на этапе создания)
  • 1
    Вы не можете иметь миграционный внешний ключ - тот, который берет идентификатор из любой из двух таблиц. Сказать, что вы хотите, чтобы два первичных ключа указывали на один и тот же внешний ключ, сбивает с толку. Кроме того, как сотрудники, так и студенты являются типами людей. Плохо практиковать перечисление ролей в виде таблиц, в этом случае вам не нужно делать то, что вы предлагаете. Персона: id, fname, lname, passowrd роль (студент, персонал). Сообщение: id, текст, дата, person_fk. Роль присуща личности человека, который мигрирует через FK.
Показать ещё 5 комментариев
Теги:
database

1 ответ

0

Если я правильно вас понимаю, внешний ключ user_fk в message относится к идентификаторам student и staff.

В этом случае, если вы попытаетесь вставить данные в таблицу message, он проверит обе таблицы student и staff для этого идентификатора. Отсюда и ошибка.

Что вы можете сделать, так это добавить два столбца внешнего ключа в message 1 для каждой таблицы.

Обновить

Вышеупомянутый подход приведет к возможности обнуления внешних ключей. Вместо этого мы можем иметь две таблицы отображения по одному для каждой таблицы. например: student_message_map и staff_message_map. Каждая таблица будет содержать 2 внешних ключа student_id и message_id/staff_id и message_id.

Это приведет к тому, что столбцы будут недействительными, но для запросов потребуется выполнить два объединения. Кроме того, кто-то, смотрящий на эти отношения, может подумать, что многие отношения многие из-за таблиц сопоставления.

ИМО с нулевым внешним ключом - это не плохая практика, вам просто нужно знать во время запросов, о возможности нулевых значений.

  • 0
    Прежде всего, спасибо за ваш ответ, я подумал об этом, но есть ли проблема, что всегда один пустой ключ останется пустым? Это означает, что если, например, ключ foreighn ссылается на идентификатор студента, то другой ключ foreighn останется пустым. Если это правильно, тогда я буду применять его, но я не знаю, является ли это хорошей практикой.
  • 0
    Это действительно так, столбцы внешнего ключа должны быть обнуляемыми. Ваши запросы к этой таблице должны будут учитывать возможные нулевые значения. Я обновлю ответ.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню