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

2023-11-24

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

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

你正在描述单表继承, 具体表继承, and 类表继承.

参见马丁·福勒的经典著作企业应用架构模式有关他们的大量信息。

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

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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将继承的对象存储在数据库中 的相关文章

  • Postgresql - 确定从级联删除中删除哪些记录

    我继承了一个相当大的 postgresql 数据库 我们有一个每月运行的作业 用于备份现有数据库并使用我们收到的更新的供应商数据创建一个新数据库 目前有一个小问题 在不深入了解表设置 数据建模内容等细节的情况下 我相信它可以通过简单的删除查
  • 用户评级的 ER 模型

    我有很多 用户 每个用户最多有 5 个 服务 用户应该能够对每项服务进行评分 0 5 我还想保留用户的平均评分 这是我的想法 但是还有更好的方法吗 User id user name dob 服务 固定数量的服务 id service de
  • ADO.NET 实体框架的实际好处是什么?

    我正在读这篇关于ADO NET 实体框架 http msdn microsoft com en us library bb399572 aspx并发现它非常有趣 尽管在第一个镜头中我无法破译很多东西 我再次阅读这篇文章 以了解其背后的真正逻
  • 如何使用 Hibernate 3.3.2GA 将 TIMESTAMP WITH TIME ZONE 映射到 Java 数据类型?

    如何映射 Oracle 列类型TIMESTAMP WITH TIME ZONE http download oracle com docs cd B19306 01 server 102 b14225 ch4datetime htm i10
  • Hibernate save() 和事务回滚

    在休眠状态下 当我save 事务中的一个对象 然后我回滚它 保存的对象仍然保留在数据库中 这很奇怪 因为这个问题不会发生在update or delete 方法 只需用save 这是我正在使用的代码 DbEntity dbEntity ge
  • Doctrine ORM 按注释对象字段排序

    所以它很简单 我在某个实体中有以下代码 var ServiceOffer ORM OneToMany targetEntity ServiceOffer mappedBy serviceProvider ORM OrderBy servic
  • 数据库、表和列命名约定? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 每当我设计数据库时 我总是想知道是否有命名数据库中项目的最佳方法 我经常问自己以下问题 表名应该是复数吗 列名应该是单数吗 我应该为表或列添加前
  • 在 django 中创建“历史”类型模型的最佳方法是什么?

    我想为我的 Django 应用程序创建一个类似于 Django 管理员的 最近操作 的功能 以便存储其他模型的历史信息 例如 假设我有两个模型 分别称为 Book 和 Author 我想要第三个模型来存储信息 例如由谁以及何时对模型中的给定
  • 只读模式下不允许写操作(FlushMode.MANUAL)

    我对Spring真的很陌生 我正在使用 JSF Hibernate Spring 开发一个简单的 JEE 应用程序 我在尝试更新 DAO 上的值时遇到一些问题 我确信问题与 Spring 配置 xml 文件有关 但我无法找出是什么 这是我的
  • 如何使用 django 更新会计应用程序中的余额?

    我正在学习 Django 尝试制作一个会计应用程序来跟踪我的开支等 我使用两种模型创建数据库 一种用于帐户 一种用于操作 但我不知道如何在每次操作时更新我的 余额 我在想 也许每次我保存一个新操作时 我都会通过覆盖操作模型的保存方法来更新余
  • @UniqueConstraint 和 @Column(unique=true) 选项之间的 Doctrine ORM 级别差异

    在数据库级别 使用一个选项与另一个选项来定义时没有区别独特性如下所示 虽然 UniqueConstraint在其文档中读取 它仅在 SchemaTool 模式生成上下文中有意义 两者之间是否存在 ORM 级别差异 我的意思是 当我们运行查询
  • 子查询与连接

    我重构了从另一家公司继承的应用程序的一个缓慢部分 以使用内部联接而不是子查询 例如 WHERE id IN SELECT id FROM 重构后的查询运行速度提高了约 100 倍 50 秒到 0 3 我预计会有改进 但谁能解释为什么它如此剧
  • 设计 Cassandra 数据模型的最佳实践是什么? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 以及需要避免哪些陷阱 您有任何交易中断吗 例如 我听说导出 导入 Cassandra 数据非常困难 这让我想知道这是否会妨碍将生产数据
  • 如何在 SQL 中存储目标(例如 RPG Quest)

    今天有人问我他们应该如何将任务目标存储在 SQL 数据库中 在这种情况下 请考虑角色扮演游戏 目标可能包括以下一些内容 发现 地点 杀死 n MOB 类型 获取 对象 的 n 个 实现 技能组 中的 技能 你在角色扮演游戏中获得的所有其他东
  • 如何使组合键唯一?

    I am making a database of students in one school Here is what I have so far 如果您不喜欢阅读 请跳至 简而言之 部分 问题是我对这个设计并不满意 我想要的组合gra
  • Lightspeed 与 NHibernate

    有什么体验光速 http www mindscape co nz products LightSpeed comparison aspx Mindscape 提供的比较并没有过多说明 NHibernate Lightspeed 看起来很灵活
  • MySQL JOIN 滥用?情况会变得有多糟糕?

    我读了很多关于关系数据库的文章 在每个 SELECT 上使用许多 JOIN 语句 但是 我一直想知道滥用这种方法从长远来看是否会出现任何性能问题 例如 假设我们有一个users桌子 我通常会添加 最常用 的数据 而不是进行任何额外的联接 例
  • 具有不同组合的产品和产品包的数据库模型

    您将如何设计数据库来实现此功能 考虑一个场景 我们想要创建一个产品关系 封装 假设我们创建一个产品表 prod id prod name prod fee 1 prepaid A 19 usd 2 prepaid B 29 usd 3 pr
  • CakePHP hasOne/belongsTo 模型关系

    我有几个模型正在尝试关联 一种模型是Item 一个是Slide 另一个是Asset 项目下方有多个幻灯片 资产基本上是已上传的文件 图像 mp3 等 幻灯片是显示资产的位置 每张幻灯片都有一个资产 但给定的资产可能属于多张幻灯片 一张幻灯片
  • Rails has_many 到 has_many 具有多个模型

    模拟以下情况的最佳方法是什么 Word belongs to wordable polymorphic gt true Phrase has many words as gt workable belongs to story Line h

随机推荐

  • GCE 区域的 IP 范围是多少?

    我需要向 CDN 提供创建 GCE 实例时可能使用的 IP 范围 按 GCE 位置划分的 IP 范围列表是否在任何地方发布 我们目前不发布哪些 IP 映射到哪些范围 我们可以并且确实根据需要移动区块以平衡容量 但是 此处列出了所有 Goog
  • Angular Material 2 浏览器自动填充垫选择不起作用

    我有一个代表地址的表单 并且我正在使用 mat select 来表示州 省 不幸的是 它不会自动填充州 省 我假设是因为它不是本地选择 这是我的标记
  • 我如何在 Scala 中表达链式赋值?

    我如何在scala中表达以下java代码 a b c 顺便说一句 我正在重新分配变量 而不是声明 Scala 中最接近的快捷语法只能在声明一个时使用var or val scala gt val c 1 c Int 1 scala gt v
  • htaccess多参数重写规则

    我知道这个问题被过度询问 但找不到任何适合我的问题的东西 我目前正在创建一个网站 我的网址如下 www foo com 或www foo com index php 它们可以采用 1 2 或 3 个不同的参数 例如 www foo com
  • 有没有办法使用 API 从 Google Drive 上的多个文件创建 zip 文件?

    如果您下载目录 Google 云端硬盘网络界面允许您下载单个 zip 文件 但是 我找不到使用 API 来做到这一点的方法 是否可以使用 API 在驱动器上创建多文件 zip 更新 Tanakie 的代码有效 这很棒 但是 我只能在我的个人
  • C# 实时 Try Catch

    我希望得到真正使用 C 进行实时编程或真正了解该语言内部原理的人的回复 我知道异常不应该用于处理正常处理 而只能用于检测错误情况 关于这个话题有很多讨论 我想知道仅仅使用 try catch 块是否会导致运行时间变慢 除非程序必须结束 否则
  • window.history.go(-1) 无法在 iOS 主屏幕应用程序中工作 [重复]

    这个问题在这里已经有答案了 因此 我试图在 iPhone HomeScreen 应用程序上将用户重定向回历史记录中的一级 但由于某种原因它只是没有触发 当前代码如下window history go 1 我也尝试过其他各种版本window
  • [:shell 编程中的意外运算符[重复]

    这个问题在这里已经有答案了 My code bin sh filename choose sh read choose choose y o choose Y echo Yes exit 0 choose n o choose N echo
  • 在 .csproj 中包含项目范围之外的内容文件

    我有一个 C 项目 MyProject csproj 位于 C Projects MyProject 我还有想要复制到该项目的输出目录中的文件 但是 这些文件位于 C MyContentFiles 位置 即它们不在项目范围内 该目录也有子目
  • C# 在运行时添加带有值的按钮[关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 我想在运行时向我的选项卡控件添加一个具有值的按钮 许多教程展示了创建与数据库的连接时是如何完成的 有没有什么方法可以在不连接数据库的情况下完成 在我将数据输入到两个文本框中并单击 保存
  • 无法覆盖 s3 中的内容处置标头

    我正在使用以下 php 函数为公众提供临时访问私有文件的权限 function get s3 signed url bucket resource AWS S3 KEY AWS s3 secret key expire seconds ex
  • IFrame 是否被 Google 抓取?

    我有一个 iframe 它的源是从 servlet 响应中获取的 那么 iframe 的内容会被抓取吗 Google 现在确实会抓取框架内容 只是还不确定有多少股权被传递给链接 http www serroundtable com goog
  • 如何删除 matplotlib 子图中的填充/边框

    第二个子图只是带有叠加图的第一个图像 在第二个图中 似乎有白色填充 边框 如何删除这个填充 空白 为了完整起见 这里是执行绘图的代码片段 fig ax plt subplots 1 2 fig set size inches 16 6 fo
  • 如何用Java创建Design QR码?

    我想用 Java 创建设计 QR 码 设计 QR 码可能包含图形形式的徽标 这是此类设计的代码的示例 如何创建这样的二维码 我刚刚找到了一个可以创建此类二维码的软件 有一种不同的方法可以将图片放入二维码中 代替 在冗余部分上乱涂乱画并依靠纠
  • 如何将生成器的下一个值放入列表中

    我制作了一个生成器来逐字读取文件 并且效果很好 def word reader file for line in open file for p in line split yield p reader word reader txtfil
  • JavaScript 中 == 和 === 有什么区别? [复制]

    这个问题在这里已经有答案了 可能的重复 Javascript vs 我使用哪个 等于 运算符重要吗 JavaScript 什么时候比 更有意义 以下方法在将字符串与未定义值进行比较时有什么区别 var x if x undefined al
  • Interface Builder 在 MacRuby 中看不到 Outlet

    我正在尝试使用 XCode 和 Interface Builder 构建一个基本的 hello world 应用程序 但是 在 Interface Builder 中我看不到连接的插座 我转到对象检查器窗格的连接选项卡 它显示 新引用插座
  • pandas 按 n 秒分组并应用任意滚动函数

    我有一些加速度计读数的 csv 数据 格式如下 不完全是这样 真实数据具有更高的采样率 2013 09 28 17 36 50 322120 0 152695 0 545074 0 852997 2013 09 28 17 36 50 62
  • Thymeleaf 将参数从 html 发送到控制器

    我是 Thymeleaf 的新手 我正在尝试创建简单的 CRUD 应用程序 我正在尝试通过删除按钮删除客户类的对象 如何使用 Thymeleaf 将参数 例如 id 设置为调用 deleteUser 的方法 这是我的控制器 package
  • 将继承的对象存储在数据库中

    我试图找出将对象模型中的继承关系映射到关系数据库的最佳方法 例如 考虑以下类结构 public Class Item public String Name get set public int Size get set public Cla