如何识别数据库关系中的父表和子表

时间:2015-04-10 12:12:00

标签: sql database oracle

虽然很多人都要求这个主题,但必须告知我不要求查询!

问题在于理论上,如何​​在数据库中区分哪个表是父表,哪个表是子表?

据我所知,具有主键的表通常是父表(也称为查找表),而具有外键的表是子表。我对吗?

2 个答案:

答案 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)
);

在图表中:

ERD of parent child

Table2Table1的孩子,因为Table2拥有其父级的外键。 (对名称表示道歉,但调用表ParentChild会使分析失败。)

如果没有外键

这可能更难。寻找证据,如:

  • 列命名约定 - 通常外键列的格式为<TableName>Id - 这可能有所帮助。
  • 用法 - 查找其他数据库实体,如视图,存储过程,规则或函数,特别是表JOIN如何组合表 - 这可能有助于确定表之间的关系。

误报

在“OO”术语中,数据库父子关系通常等同于 OO组合,即没有父母的孩子就不能存在。

但请注意,数据库外键也常用于:

  1. 非父子关系,例如分类
  2. e.g。

    CREATE TABLE Person
    (
        ...
        LocationId INT FOREIGN KEY REFERENCES Country(CountryId)
    )
    

    在这里,人和国家在逻辑上可以彼此不存在,因此这种关系更像是OO聚合或关联关系,而不是父子关系。

    1. 继承和扩展表
    2. 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)

父子关系由外键约束的定义来定义。约束通常在子表上创建,但这只是语法 - 约束确实作为自己的实体存在并且链接到两个表。

子表将具有一个或多个与父表上的一个或多个列相关的列。父表列必须具有主要或唯一约束位置。