如何使用数据库表模拟“扩展类”?

时间:2011-04-29 04:38:50

标签: mysql database database-design entity-relationship

我将有几种不同类型的用户将使用我的系统。对于所有用户,我需要存储用户名,密码,电子邮件地址等内容,但如果他们是A类用户,我还需要存储字段a,b和c的值,但如果他们是用户类别B,我需要存储字段d,e,f和g的值。

USER
-------
id
username
password

CAT_A
--------
id
a
b
c

CAT_B
--------
id
d
e
f
g

我很可能需要使用某种桥接表将用户链接到其中一个CAT表,但我该如何去做呢?我不能使用这样的东西:

EXTEND
--------
user_id
cat_id

因为我不知道cat_id引用哪个CAT表。我是否需要每个类别的字段?如果是这样,那似乎没有标准化,因为会有很多空字段,特别是如果我有3个类别。

EXTEND
--------
user_id
cat_a_id
cat_b_id
...

非常感谢任何输入!

2 个答案:

答案 0 :(得分:3)

在SQL中映射层次结构有几种常用方法。因为SQL没有处理继承的自然方法,所以这些传统方法中的每一种都有各自的优缺点。一些常见的是:每个层次的表,每个类型的表和每个具体的表类型,但可能还有其他几个。下面是每个类型的表模型的示例(代码中的每个类型直接映射到表):

User
---------------
user_id (PK, auto-generated?)
username
password

CategoryAUser
---------------
user_id (PK, FK to User.user_id)
a
b
c

CategoryBUser
---------------
user_id (PK, FK to User.user_id)
e
f
g
h

要获取所有A类用户,请从用户内部联接CategoryAUser中进行选择。 B类用户也是如此。此型号可能适合您的需求,也可能不适合您。如果不是,我会建议搜索上面提到的其他类型的模型。

答案 1 :(得分:1)

我知道这个帖子已经过时了,但我正在寻找一个优雅的解决方案。根据我过去所做的事情:

您可以在USER表中添加一列,告诉用户所属的“类别”。然后,当您查询用户表时,可以基于该查询建立类别查询。

或者,您可以“左外连接”所有类别表,并将结果基于您返回的列。在这种情况下,您将获得USER列和所有a,b,c,d,e,f和g。当然,如果该表中没有该用户的条目,那么其中一些列将为null。