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