У меня есть 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 для этого числа …
Таким образом, вам придется вынуждать ограничения внешнего ключа в ваших запросах, но он работает. У каждого есть идентификатор из одного пула (: