2016-05-24 54 views
0

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

例如,我有两个类型的用户(可以称它们user1user2),因为这两种类型的用户具有多个不同的信息,所以我创建两个表中的每个人,并且每个用户具有一个帐户登录到系统。所以我创建了一个表呼叫帐户,并让两个表user1user2参考表帐户中的ID。所以当我有一个帐户,我想知道这个帐户属于哪一个。这很不方便,因为我必须在两张桌子上找。

它有解决这个问题的方法吗?

回答

1

如果你有一个实体user,只创建一个表user他们。

用户是一个用户,不管他是否有一些特殊的角色。所有用户都会有一些共同的字段,例如一个名字。

table user: 
user id 
user name 
age 
homepage 

,为不同类型的用户的特定信息,为您打造专业化表对这些角色的信息:

table role1: 
user id 
roleinfo1 
roleinfo2 

table role2: 
user id 
roleinfo3 
roleinfo4 
roleinfo5 

通过这种方式,用户可以在同一时间有多个角色,但你当然可以限制他们只有一个。

如果用户只能是其中一个角色(称为分离),那么您可以使用附加的statndard方法将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向表角色2添加条目。

你可以加入表来获得“整体”的画面,

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

这种意志,除了双ID列(将基本上可视为到注释标记istype1istype2秒解决方案)和缺少的角色列看起来就像只有一个表的第二种方法。

要检查是否有user id = 1用户角色1,您可以检查是否role1.user id在此查询null,或检查user id = 1在表role1。例如,列出所有数据只是角色1,您可以使用

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

(它使用一个连接,而不是左的加入,因为和角色1项已存在)。

在大多数情况下,您甚至不需要专门的数据,因此您可以将您的account表与user表连接起来。在任何情况下,您都不必担心检查两张表格(如果您决定添加第三种用户,甚至更多)。

+0

谢谢。我正在考虑为每种类型的用户创建两个表,并为两个表之间的某些常见属性创建一个视图。这种方法的弱点是什么? – buggy3

+0

@oopaewem你的方法的一周点是a)它没有,绝对没有正确方法的优势b)你不能确保表1和2中的用户没有相同的用户标识c)你不能使用用户标识作为任何表的外键d)现在这种类型的问题会在每次尝试将userdata与其他数据加入时在***中咬你 - 你总是必须检查两个表e)添加更多角色f)如果你因为某种原因绝对想要2个“桌子”,从用户g创建视图user1和user2你可能只是想相信我们这是错的 – Solarflare

+0

我现在明白了。谢谢 :) – buggy3

1

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

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

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

+0

但是,当我有一位家长,我怎么能找到它的孩子?我仍然需要在两张桌子上找? – buggy3

+0

你不能,父母甚至不知道他有孩子,但孩子知道他的父母是谁。 也许给一个用例你到底想要完成什么。 从我的例子中,如果你想要一个客户你呼叫客户表的客户,如果你想要一个员工你,员工表 – mimzee

相关问题