我有3个表,student
,parent
和staff
分别有PK studentid
,parentid
,staffid
。我想用PK member
创建一个memberid, username, password
表。一位成员可以是student
或parent
或staff
。我想用外键加入这个成员表和成员相关表(如果成员是学生,学生表等)。
目前我正在使用member type
的另一列并将其设为
1 for student,
2 for parent and
3 for staff,
用php编写程序。
但我需要另一种有效的方法来使用关系结构创建表。
答案 0 :(得分:2)
我假设您使用的是MySQL,但其他DBMS可能类似。
使用单个列或表无法执行您所要求的操作。您可以使用关系数据库实现此选项:
选项1 :让您的成员表包含三列,其中包含对员工,父级和学生表的关系约束。用户的类型由哪个列填充(保留其他列NULL
)
选项2 :将您要存储的数据放在员工,父母和学生表上的每个成员上(如用户名和密码)
每个都有自己的缺点,第一个是你必须检查每一列以找出当前个人的成员类型并加入正确的表,或者当你需要登录某人时搜索三个表。还有不是您的会员memberid
的单一游泳池。 (你可以做类似于@Sherif建议的事情)
答案 1 :(得分:2)
在student,parent,staff表中,添加一个“fk_memberID”列,该列指向成员表中的关联记录。
创建新成员时,首先插入成员数据,然后获取新记录的memberid。
然后当您插入特定类型表时,将memberid放在最后。
答案 2 :(得分:0)
对于member
表memberID
和memberType
将是复合键。
对于JOIN
,您必须一次加入两个键。
E.G。
获取所有学生的名单
SELECT m.* FROM
student s INNER JOIN
member m ON ( m.memberID = s.studentID AND m.memberType = 1 )
答案 3 :(得分:0)
创建表
CREATE TABLE userid(counter int(11));
在此表中插入1条记录,其中counter = 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设置为这个数字......
通过这种方式,您将不得不在查询中强制使用外键约束,但它可以正常工作。每个人都有来自同一个池的ID(: