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

Nig*_*awk 8 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
Run Code Online (Sandbox Code Playgroud)

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

EXTEND
--------
user_id
cat_id
Run Code Online (Sandbox Code Playgroud)

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

EXTEND
--------
user_id
cat_a_id
cat_b_id
...
Run Code Online (Sandbox Code Playgroud)

任何输入都非常感谢!

And*_*ite 5

有几种常见的方法可以在 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
Run Code Online (Sandbox Code Playgroud)

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