如果在另一个表中有两个表引用单列时如何设计表,如何在另一个表中有两个表引用单列时设计表
例如,我有两个类型的用户(可以称它们user1
和user2
),因为这两种类型的用户具有多个不同的信息,所以我创建两个表中的每个人,并且每个用户具有一个帐户登录到系统。所以我创建了一个表呼叫帐户,并让两个表user1
和user2
参考表帐户中的ID。所以当我有一个帐户,我想知道这个帐户属于哪一个。这很不方便,因为我必须在两张桌子上找。
它有解决这个问题的方法吗?
如果在另一个表中有两个表引用单列时如何设计表,如何在另一个表中有两个表引用单列时设计表
例如,我有两个类型的用户(可以称它们user1
和user2
),因为这两种类型的用户具有多个不同的信息,所以我创建两个表中的每个人,并且每个用户具有一个帐户登录到系统。所以我创建了一个表呼叫帐户,并让两个表user1
和user2
参考表帐户中的ID。所以当我有一个帐户,我想知道这个帐户属于哪一个。这很不方便,因为我必须在两张桌子上找。
它有解决这个问题的方法吗?
如果你有一个实体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
即使用户可以属于多个类别,并在情况下,有更多列之间没有重叠,当然你也可以使用最后一种方法并添加多个标记(例如列istype1
和istype2
),尽管这是一种非标准方法。
更新只是为了阐明您如何使用第一种解决方案:每个用户在表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列(将基本上可视为到注释标记istype1
,istype2
秒解决方案)和缺少的角色列看起来就像只有一个表的第二种方法。
要检查是否有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
表连接起来。在任何情况下,您都不必担心检查两张表格(如果您决定添加第三种用户,甚至更多)。
谢谢。我正在考虑为每种类型的用户创建两个表,并为两个表之间的某些常见属性创建一个视图。这种方法的弱点是什么? – buggy3
@oopaewem你的方法的一周点是a)它没有,绝对没有正确方法的优势b)你不能确保表1和2中的用户没有相同的用户标识c)你不能使用用户标识作为任何表的外键d)现在这种类型的问题会在每次尝试将userdata与其他数据加入时在***中咬你 - 你总是必须检查两个表e)添加更多角色f)如果你因为某种原因绝对想要2个“桌子”,从用户g创建视图user1和user2你可能只是想相信我们这是错的 – Solarflare
我现在明白了。谢谢 :) – buggy3