Intereting Posts
Использование Apache ANT для развертывания веб-приложений? Сократите URL, удалив пустые переменные GET и упростив имена переменных css / php: как решить эту проблему с float div / нечетный четный цикл в массиве Не могу понять, почему скрипт php не работает при вызове $ .ajax Как использовать AJAX в WordPress Shortcode? В чем смысл класса PHP SpldoublyLinkedList и, что более важно, Linked Lists в целом? Как я могу найти город и штат с помощью почтового индекса или почтового кода во всем мире с помощью API или веб-сервиса с PHP? Создание дерева категорий в виде неупорядоченного списка HTML Передача NULL из PHP в MySQL для автоматического увеличения Yii Модель с составным первичным ключом Переопределение заголовка кэша PHP Анализ SOAP-ответа Как преобразовать строку в float с «хвостом»? Woocommerce – необходимо отправить электронное письмо по определенному адресу на основе почтового индекса Как я могу очистить содержимое веб-сайта на PHP с веб-сайта, для которого требуется вход в cookie?

Внешний ключ для нескольких таблиц

У меня есть 3 таблицы, student , parent и staff с student ПК, parentid , staffid соответственно. Я хочу создать таблицу- member , с member PK memberid, username, password . Один член может быть student parent или staff . Я хочу присоединиться к этой таблице-члену и связанной с ним таблице (если член – студент, таблица учеников и т. Д.) С внешним ключом.

В настоящее время я использую другой столбец для member type и помещаю его как

 1 for student, 2 for parent and 3 for staff, 

и выполнение программы с php.

Но мне нужен еще один эффективный способ создания таблиц с использованием реляционной структуры.

Я предполагаю, что вы используете MySQL, но другие СУБД могут быть похожими.

Невозможно делать то, что вы спрашиваете, с помощью одного столбца или таблицы. У вас есть несколько вариантов реализации этого с использованием реляционных баз данных:

Вариант 1 : укажите в таблице участника три столбца с реляционными ограничениями для персонала, родительских и студенческих таблиц. Тип пользователя подразумевается, какой столбец заполняется (оставьте остальные NULL )

Вариант 2 : Поместите данные, которые вы хотите сохранить на каждом члене, на таблицы персонала, родителей и учеников (например, имя пользователя и пароль)

Каждый из них имеет свои собственные недостатки, в первую очередь вам нужно будет проверить каждый столбец, чтобы узнать, какой тип члена является текущим человеком, и присоединиться к правильной таблице, или искать три таблицы, когда вам нужно войти в систему. Также нет единого пула memberid для ваших членов. (Вы могли бы сделать что-то похожее на то, что предложил @Sherif)

В таблице ученика, родителя, персонала добавьте столбец «fk_memberID», который указывает на соответствующую запись в таблице участников.

Создавая новый член, вы сначала вставляете данные элемента и получаете член новой записи.

Затем, когда вы вставляете в таблицу определенного типа, вы помещаете член в конец.

Для членов- member memberID и memberType будет составным.

Для JOIN вам нужно присоединиться к обеим клавишам одновременно.

НАПРИМЕР

Чтобы получить список всех студентов

 SELECT m.* FROM student s INNER JOIN member m ON ( m.memberID = s.studentID AND m.memberType = 1 ) 

Создать таблицу

  CREATE TABLE userid(counter int(11)); 

Вставить в эту таблицу 1 запись с счетчиком = 100001, например

Теперь создайте процедуру getnextid (newid)

  DELIMITER $$ USE `your_database`$$ DROP PROCEDURE IF EXISTS `getnextid`$$ CREATE DEFINER=`username`@`%` PROCEDURE `getnextid`(OUT newid INT) BEGIN SELECT counter INTO newid FROM userid FOR UPDATE; UPDATE userid SET counter = counter+1; END$$ DELIMITER ; 

Теперь каждый раз, когда вы хотите вставить любого из этих учеников, вы можете вызвать getnextid () и установить его id для этого числа …

Таким образом, вам придется вынуждать ограничения внешнего ключа в ваших запросах, но он работает. У каждого есть идентификатор из одного пула (: