如何在另一个表中有两个表引用单列时设计表

时间:2016-05-24 13:56:53

标签: mysql

当在另一个表中有两个表引用单列时,我很困惑如何设计表。

例如,我有两种类型的用户(让我们称之为user1user2),因为这两种类型的用户有多个不同的信息,所以我为每个用户和每个用户创建了两个表有一个帐户登录系统。所以我创建了一个表调用帐户,让两个表user1user2引用表帐户中的ID。所以,当我有一个帐户,我想知道这个帐户属于哪一个。这很不方便,因为我必须在两张桌子中寻找。

是否有解决此问题的方法?

2 个答案:

答案 0 :(得分:1)

帐户表的重点是什么?如果每个用户都有一个帐户,为什么不将帐户列存储在用户表中。

此外,您仍然可以为他们共享的列创建父用户表,然后为特定用户创建子表。

例如,


家长:用户
儿童:员工/客户

答案 1 :(得分:1)

如果您有实体user,请为它们创建一个表user

用户是用户,无论他是否具有某些特殊角色。所有用户都会有一些共同的字段,例如:一个名字。

table user:
user id 
user name 
age
homepage

要为不同类型的用户提供特定信息,请创建包含有关这些角色的信息的专业化表:

table role1:
user id
roleinfo1
roleinfo2

table role2:
user id
roleinfo3
roleinfo4
roleinfo5

这样,用户可以同时拥有多个角色,但您当然可以将它们限制为仅一个角色。

如果用户只能是其中一个角色(称为析取),您可以使用额外的标准方法将列role添加到用户表中并将所有信息并排放入用户表,保留不属于用户角色null的那些:

table user:
user id 
user name 
age
homepage
roletype

roleinfo1
roleinfo2

roleinfo3
roleinfo4
roleinfo5

即使用户可以属于多个类,并且如果其他列之间没有重叠,您当然可以使用最后一种方法并添加多个标记(例如列istype1istype2 ),虽然这是一种非标准方法。

更新只是为了说明您如何使用第一个解决方案:每个用户在表user中都有一个条目,例如:与user id = 1。这也确保了角色user1和user2的用户不能拥有相同的用户ID。 角色表中的User id既是主键,也是用户表的外键。

要使该用户成为角色1的用户,您可以使用role 1向表user id = 1添加一个条目。如果他(也)是角色2的用户,则使用user id = 1向表role2添加条目。

您可以加入表格以获得“整体”图片,

select * from user
left join role1 on user.`user id` = role1.`user id`
left join role2 on user.`user id` = role2.`user id`

除了双重id列(基本上可以将其视为标记istype1,“秒”解决方案的注释中的istype2)和缺少的角色列外观之外只有一个表的第二种方法。

要检查user id = 1的用户是否属于角色1,您可以检查此查询中role1.user idnull,还是检查user id = 1是否在表role1中1}}。例如,列出角色1的所有数据,您可以使用

select * from user join role1 on user.`user id` = role1.`user id`

(它使用连接而不是左连接,因为角色1的条目必须存在)。

在大多数情况下,您甚至不需要专门的数据,因此您只需将account - 表与user - 表一起加入即可。在任何情况下,您都不必担心检查两个表(如果您决定添加第三类用户,甚至更多)。