Database 在关系数据库中实现模型

Database 在关系数据库中实现模型,database,relational-database,Database,Relational Database,我有一个超类/子类层次关系,如下所示: 超级班:IT专家 子类:数据库、Java、UNIX、PHP 假设一个超类的每个实例可能不是一个子类的成员,而一个超类实例可能是两个或更多子类的成员,我将如何实现这个系统 我还没有给实体分配任何属性,所以我觉得这非常模糊,我不知道从哪里开始。要开始,您需要一个包含所有超类的表(在您的示例中,只有IT专家,但它也可以包含网络专家,或数字专家)之类的内容。我将这些内容包括在内,以增加一些特色: ID | Name | ---

我有一个超类/子类层次关系,如下所示:

超级班:IT专家

子类:数据库、Java、UNIX、PHP

假设一个超类的每个实例可能不是一个子类的成员,而一个超类实例可能是两个或更多子类的成员,我将如何实现这个系统


我还没有给实体分配任何属性,所以我觉得这非常模糊,我不知道从哪里开始。

要开始,您需要一个包含所有超类的表(在您的示例中,只有
IT专家
,但它也可以包含
网络专家
,或
数字专家
)之类的内容。我将这些内容包括在内,以增加一些特色:

ID  | Name                  | 
-----------------------------
1   | IT Specialist         |
2   | Networking Specialist |
3   | Digital Specialist    |
您还将拥有另一个包含所有子类的表:

ID  | Name         | 
--------------------
1   | Databases    |
2   | Java         |
3   | UNIX         |
4   | PHP          |
例如,假设一个
网络专家
需要了解
数据库
,一个
数字专家
需要了解
Java
PHP
。一个
IT专家
需要了解上面列出的所有四个字段

有两种可能的方法。其中一种方法是在子类表中设置“标志”:

ID  | Name      | Is_IT | Is_Networking | Is_Digital
----------------------------------------------------
1   | Databases | 1     | 1             | 0
2   | Java      | 1     | 0             | 1
3   | UNIX      | 1     | 0             | 0
4   | PHP       | 1     | 0             | 1
记住,这只是使用了一小部分技能。如果你开始有很多超类,子类表中的列可能很快就会失控

幸运的是,您还可以使用称为的东西(也称为关联实体)。本质上,桥接表允许您在另一个表中有两个外键作为主键,从而解决了多对多关系的问题

您可以通过创建一个新表来设置它,哪些子类与哪些超类关联起来:

ID  | Sub-class ID | Super-class ID |
-------------------------------------
1   | 1            | 1              |
2   | 1            | 2              |
3   | 2            | 1              |
4   | 2            | 3              |
5   | 3            | 1              |
6   | 4            | 1              |
7   | 4            | 3              |
请注意,sub-class ID和super-class ID字段中都有“重复项”,但ID字段中没有重复项。这是因为桥接表具有唯一的ID,用于建立独立关联。sub-class 1(
数据库
)需要关联到两个不同的组(
IT专家
Networking专家
)。因此,需要成立两个不同的协会

上述两种方法都给出了相同的“结果”。这里唯一真正的区别是桥接表将为您提供更多的,而设置多个标志将为您提供更多的。显然,您创建查询的方式也将有所不同

您选择哪一种方法取决于您处理的数据量,以及未来数据库的扩展范围:)


希望这有帮助!:)

这是一个常见问题,请用谷歌搜索stackoverflow数据库子类型。你发布这个问题已经有一段时间了,所以我只是跟进一下,看看你是否仍然有这个问题?如果您这样做,请让我们知道,这样我们可以尝试进一步帮助您。如果您的问题已在此处的答案帮助下成功解决,请不要忘记通过单击投票按钮下方的灰色复选框接受解决方案。当然,说这句话,你没有义务接受我的答案(或任何其他答案),尽管这确实有助于保持网站的顺利进行:)