在关系数据库中实现模型

时间:2017-03-08 23:50:51

标签: database relational-database

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

超级课程:IT专家

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

鉴于超类的每个实例可能不是子类的成员,而超类实例可能是两个或更多子类的成员,我将如何实现此系统?

我没有被赋予任何属性来分配给实体,所以我觉得这很模糊,我不知道从哪里开始。

1 个答案:

答案 0 :(得分:0)

要开始使用,您将拥有一个包含所有超类的表(在您的示例中,只有IT Specialist,但它也可能包含Networking Specialist之类的内容,或者Digital Specialist)。我已将这些包括在内以提供更多的味道:

ID  | Name                  | 
-----------------------------
1   | IT Specialist         |
2   | Networking Specialist |
3   | Digital Specialist    |

您还将拥有另一个包含所有子类的表:

ID  | Name         | 
--------------------
1   | Databases    |
2   | Java         |
3   | UNIX         |
4   | PHP          |

例如,假设Networking Specialist需要了解Databases,而Digital Specialist需要了解JavaPHPIT Specialist需要知道上面列出的所有四个字段。

有两种方法可以解决这个问题。一种方法是在子类表中设置'flags':

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

请记住,这只是使用少量技能。如果您开始拥有 lot 超类,那么子类表中的列可能会很快失控。

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

你可以通过一个新表关联来设置它,哪些子类属于哪些超类:

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              |

请注意,子类ID和超类ID字段中都存在“重复”,但ID字段中没有重复项。这是因为桥接表具有唯一的ID,用于进行独立关联。子类1(Databases)需要与两个不同的组(IT SpecialistNetworking Specialist)相关联。因此,需要形成两种不同的关联。

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

您选择使用哪两种方法实际上取决于您要处理的数据量,以及数据库将来扩展的范围:)

希望这有帮助! :)