gpt4 book ai didi

database-design - 将继承的对象存储在数据库中

转载 作者:行者123 更新时间:2023-12-05 00:06:08 25 4
gpt4 key购买 nike

我试图找出将对象模型中的继承关系映射到关系数据库的最佳方法。例如,考虑以下类结构。

public Class Item 
{
public String Name{get; set;}
public int Size {get; set}
}

public Class Widget:Item
{
public String Color{get; set;}
}

public Class Doohicky:Item
{
public String Smell{get; set;}
}

以下是我正在考虑的一些关于如何将此结构保存到数据库的选项。

选项 1:所有项目类型的单个表
Items Table: ItemID, Name, Color, Smell

这很糟糕,因为它需要 NULL 值。

选项 2:每个项目类型的单独表格
Widgets Table: WidgetID, Name, Color
Doohicky Table: DoohickyID, Name, Smell

这更好,但会更难列出所有项目

选项 3:链接表
Items Table: ItemID (PK), Name, Size
Widgets Table: WidgetID (PK), ItemID (FK), Color
Doohicky Table: DoohickyID (PK), ItemID (FK), Smell

我认为这个选项是最好的,因为它可以防止我在任何字段中使用 Null 值,而且它可以更轻松地列出所有项目,和/或创建特定类型项目(小部件或 Doohickies)的列表。

但是,我不确定如何创建 Items 表与 Widgets 和 Doohickies 表之间的关系。我不希望任何一个表中的行都引用 Items 表中的相同 ItemID。

例如,当我向 Widgets 表中添加一个条目时,如何确保它链接到具有唯一 ItemID 的 Items 表中的新条目?我是否应该只跟踪 ItemID 而不是单独的类型特定 ID,如 WidgetID 和 DoohickyID,并使用它在 Items 表和类型特定表之间创建一对一的关系?

选项 4
Items Table: ItemID (PK), Name, Size
Widgets Table: ItemID (PK), Color
Doohicky Table: ItemID (PK), Smell

最佳答案

您正在描述 Single-Table Inheritance , Concrete Table Inheritance , 和 Class Table Inheritance .

参见经典 Martin Fowler 书 Patterns of Enterprise Application Architecture有关它们的大量信息。

为了确保只有一个子类型可以引用父类(super class)型,您可以做的一件事是使用 ItemType field 。外键可以引用 UNIQUE 约束和 PRIMARY KEY 的列。所以你可以添加 Items.ItemType并对 ItemID 进行唯一约束, ItemType .每个子类型表中的外键引用这个两列唯一键。然后你可以约束 ItemType在每个子类型表中都要有一定的值。那么它必须匹配父类(super class)型表中的值,该表只能有一个值。

Items Table: ItemID (PK), ItemType, Name, Size
UNIQUE: (ItemID, ItemType)
Widgets Table: ItemID (PK), ItemType, Color
FK: (ItemID, ItemType)
CHECK: ItemType=W
Doohicky Table: ItemID (PK), ItemType, Smell
FK: (ItemID, ItemType)
CHECK: ItemType=D

关于database-design - 将继承的对象存储在数据库中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3672956/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com