识别关系的外键

Foreign key on identifying relationships

让我们从我在网上找到的识别关系的快速定义开始:

一个标识关系是当子 table 中的一行的存在依赖于父 table 中的一行时,这意味着子 table 的主键=61=] 包含属于引用父 table.

的外键的列

我的示例:我使用 SQL 服务器,我的示例如下:

  1. 我创建了一个数据 table 来存储关于模式的数据(元数据),是的,如果您想知道,系统视图信息是不够的:)

    我的元数据 table 称为 Schemas_Metadata 并且有一个 Name 列作为主键。

    Schemas_Metadata
    ----------------
    PK (Name)
    
  2. 我创建了另一个元数据 table 来存储关于 table 的数据,我的元数据 table 被称为 Tables_Metadata 并且有一个 Name 列和一个 Schema_Name 列(外键引用 Schemas_Metadata table 中的 Name 列)和一个组合主键 (Schema_Name, Name)。这是一种识别关系。

    Tables_Metadata
    PK (Schema_Name, Name)
    
  3. 我创建了另一个元数据 table 来存储有关名为 Columns_Metadata 的列的数据,它也有一个 Name 列、一个 Table_Name 列和不幸的是,一个 Schema_Name 列(Table_Name, Schema_Name 是引用 Tables_Metadata table 中的 Schema_Name,Name 列的外键和一个组合主键(Schema_Name, Table_Name, Name).这也是一种识别关系。

    Columns_Metadata
    PK (Schema_Name, Table_Name, Name)
    

我的问题:

在第三层,我是否需要在 Columns_Metadata table 中创建两列 Schema_NameTable_Name 并且我是否必须创建我不需要的列每次我在识别关系上创建外键时都需要,或者有更好的方法吗?

首先,让我表达我的观点,即与您的问题相比,信息模式和 sys 模式的现有设计非常精细、深入和复杂,如果我们暂时忘记它的内容所涉及的问题元数据,是 table 设计的一个非常简单的案例。因此,我怀疑您是否需要制作另一个架构。

回答你的问题:我会在 Tables_Metadata 上创建一个 id 列,将 PK 单独放在 id 上,并添加一个检查约束 unique (schema_name,name).

那么,Columns_Metadatatable只需要两个字段:Name,和Tables_Metadata_id FK to Tables_Metadata.id