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

我将有几种不同类型的用户使用我的系统。 对于所有需要存储用户名,密码,电子邮件地址等用户的用户,如果他们是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
...

任何输入都非常感谢!


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

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类用户也是如此。 这种模式可能会或可能不适合您的需求。 如果没有,我会建议搜索上面提到的其他类型的模型。


我知道这个线程很旧,但我正在寻找一个优雅的解决方案。 根据我过去所做的事情:

您可以在您的USER表中添加一列,告诉用户属于哪个“类别”。 然后,当你查询用户表时,你可以根据你的分类查询。

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

链接地址: http://www.djcxy.com/p/6467.html

上一篇: How to emulate "extending a class" with database tables?

下一篇: how do i import and use WordNet 3.0 in python?