我有一个超类/子类层次关系,如下所示:
超级课程:IT专家
子类:数据库,Java,UNIX,PHP
鉴于超类的每个实例可能不是子类的成员,而超类实例可能是两个或更多子类的成员,我将如何实现此系统?
我没有被赋予任何属性来分配给实体,所以我觉得这很模糊,我不知道从哪里开始。
答案 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
需要了解Java
和PHP
。 IT 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 Specialist
和Networking Specialist
)相关联。因此,需要形成两种不同的关联。
上述两种方法都给出了相同的“结果”。这里唯一真正的区别是,桥接表会为您提供更多行,而设置多个标记会为您提供更多列。显然,您制作查询的方式也会有所不同。
您选择使用哪两种方法实际上取决于您要处理的数据量,以及数据库将来扩展的范围:)
希望这有帮助! :)