当在另一个表中有两个表引用单列时,我很困惑如何设计表。
例如,我有两种类型的用户(让我们称之为user1
和user2
),因为这两种类型的用户有多个不同的信息,所以我为每个用户和每个用户创建了两个表有一个帐户登录系统。所以我创建了一个表调用帐户,让两个表user1
和user2
引用表帐户中的ID。所以,当我有一个帐户,我想知道这个帐户属于哪一个。这很不方便,因为我必须在两张桌子中寻找。
是否有解决此问题的方法?
答案 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
即使用户可以属于多个类,并且如果其他列之间没有重叠,您当然可以使用最后一种方法并添加多个标记(例如列istype1
和istype2
),虽然这是一种非标准方法。
更新只是为了说明您如何使用第一个解决方案:每个用户在表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 id
是null
,还是检查user id = 1
是否在表role1
中1}}。例如,列出角色1的所有数据,您可以使用
select * from user join role1 on user.`user id` = role1.`user id`
(它使用连接而不是左连接,因为角色1的条目必须存在)。
在大多数情况下,您甚至不需要专门的数据,因此您只需将account
- 表与user
- 表一起加入即可。在任何情况下,您都不必担心检查两个表(如果您决定添加第三类用户,甚至更多)。