虽然很多人都要求这个主题,但必须告知我不要求查询!
问题在于理论上,如何在数据库中区分哪个表是父表,哪个表是子表?
据我所知,具有主键的表通常是父表(也称为查找表),而具有外键的表是子表。我对吗?
答案 0 :(得分:8)
在大多数情况下,如果表格中包含referential integrity,您可以检查外键以识别父子关系。子表具有引用父项的外键。这样,同一父级的所有子级将具有相同的外键值。
例如,在以下关系中:
CREATE TABLE Table1
(
-- Key for Parent
Table1ID INT CONSTRAINT PK_Table1 PRIMARY KEY,
);
CREATE TABLE Table2
(
-- Key for Child
Table2ID INT CONSTRAINT PK_Table2 PRIMARY KEY,
-- Foreign Key to Parent
Table1ID INT CONSTRAINT FK_Table2_Table1 REFERENCES Table1(Table1ID)
);
在图表中:
Table2
是Table1
的孩子,因为Table2
拥有其父级的外键。 (对名称表示道歉,但调用表Parent
和Child
会使分析失败。)
如果没有外键
这可能更难。寻找证据,如:
<TableName>Id
- 这可能有所帮助。JOIN
如何组合表 - 这可能有助于确定表之间的关系。误报
在“OO”术语中,数据库父子关系通常等同于 OO组合,即没有父母的孩子就不能存在。
但请注意,数据库外键也常用于:
e.g。
CREATE TABLE Person
(
...
LocationId INT FOREIGN KEY REFERENCES Country(CountryId)
)
在这里,人和国家在逻辑上可以彼此不存在,因此这种关系更像是OO聚合或关联关系,而不是父子关系。
OO继承和数据库表'扩展'模式的建模与父子模式略有不同,因为第二个表的主键也是父表主键的外键,即Table2
中的一行必须在Table1
中有一个相应的行,因此Table1到Table2之间的基数为1 to 0..1
,而父子将为1 to 0..n
CREATE TABLE Table1
(
-- Key for Parent
Table1ID INT CONSTRAINT PK_Table1 PRIMARY KEY,
);
CREATE TABLE Table2
(
-- Table2's primary key is ALSO a FOREIGN key to Table 1
SomeId INT CONSTRAINT PK_Table2 PRIMARY KEY,
CONSTRAINT FK_Table2_Table1 FOREIGN KEY (SomeId) REFERENCES Table1(Table1ID)
);
在数据库模型中发现OO关系的一个失败的赠品是存在多个“子类”表,它们重用AND参考基表的主键。
在表扩展中(通常是设计气味),Table1
中可能会有非常多的列,然后溢出到Table2
(想到Siebel客户表)。
答案 1 :(得分:1)
父子关系由外键约束的定义来定义。约束通常在子表上创建,但这只是语法 - 约束确实作为自己的实体存在并且链接到两个表。
子表将具有一个或多个与父表上的一个或多个列相关的列。父表列必须具有主要或唯一约束位置。