如何用数据库表模拟“扩展类”?
Posted
技术标签:
【中文标题】如何用数据库表模拟“扩展类”?【英文标题】:How to emulate "extending a class" with database tables? 【发布时间】:2011-08-15 05:43:24 【问题描述】:我将有几种不同类型的用户使用我的系统。对于所有用户,我需要存储用户名、密码、电子邮件地址等内容,但如果他们是 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
...
非常感谢任何输入!
【问题讨论】:
关系数据库在这方面很吃力。正如他们所说,gl hf。 所以你的意思是没有一个“好的”解决方案? 我不知道,至少。 (如果您希望我发表评论,请在您的评论中添加@zneak;否则我不会收到通知) @zneak 如果我有一个 USER 表,它包含一个桥接表的 FK,并且在该桥接表中我列出了 USER 表的 PK,而在另一个字段中我有 CAT 表名,该怎么办?我可能无法创建一个查询,但是使用一些 php,我可以获得我需要的结果......你觉得呢? 另见我对***.com/questions/695752/…的回复 【参考方案1】:有几种常见的方法可以在 SQL 中映射层次结构。由于 SQL 没有处理继承的自然方法,因此这些常规方法中的每一种都有其优点和缺点。一些常见的有:table-per-hierarchy、table-per-type 和 table-per-concrete-type,但可能还有其他几种。下面是一个 table-per-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表,我怎么知道要查询其他表中的哪一张来获取剩余的数据呢? 外键只存在于两个表之一中。使用 Join 语句,它将链接到正确的表,然后您可以从那里开始。【参考方案2】:我知道这个帖子很旧,但我自己正在寻找一个优雅的解决方案。根据我过去所做的:
您可以在 USER 表中添加一列,说明用户所属的“类别”。然后,当您查询用户表时,您可以基于此进行类别查询。
或者,您可以“左外连接”所有类别表,并将结果基于您返回的列。在这种情况下,您将取回 USER 列以及所有 a、b、c、d、e、f 和 g。当然,如果该表中没有该用户的条目,其中一些列将为空。
【讨论】:
以上是关于如何用数据库表模拟“扩展类”?的主要内容,如果未能解决你的问题,请参考以下文章