问题标签 [class-table-inheritance]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
21402 浏览

database - 数据库继承技术?

当您需要将具有继承的类持久化到不支持继承的关系数据库时,有哪些技巧/技术?

假设我有这个经典的例子:

设计数据库的可用技术有哪些?各有优劣?

ps 我已经搜索并发现了几个关于数据库继承的问题,但大多数都是关于更改为原生支持它的数据库引擎。但是假设我坚持使用 SQL Server 2005……我有什么选择?

0 投票
6 回答
12668 浏览

database-design - 类似于数据库设计中的继承

假设您正在建立一个数据库来存储各种车辆的碰撞测试数据。您想要存储快艇、汽车和卡丁车的碰撞测试数据。

您可以创建三个单独的表:SpeedboatTests、CarTests 和 GokartTests。但是每个表中的很多列都是相同的(例如,执行测试的人员的员工 ID、碰撞方向(前、侧、后)等)。但是,很多列会有所不同,因此您不想将所有测试数据放在一个表中,因为您将有很多列对于快艇始终为空,还有很多列将始终为空对汽车来说是空的,而对于卡丁车来说,相当多的总是空的。

假设您还想存储一些与测试不直接相关的信息(例如被测试事物的设计者的员工 ID)。这些列似乎根本不适合放在“测试”表中,特别是因为它们将在同一辆车上的所有测试中重复。

让我说明一种可能的表格排列方式,以便您了解所涉及的问题。

这种结构有什么好处/坏处,实现这样的东西的首选方式是什么?

如果还有一些适用于您希望在 Vehicles 表中拥有的所有车辆的信息怎么办?CarTests 表会看起来像......

看起来这只是一个皇家混乱。应该如何设置这样的东西?

0 投票
5 回答
56053 浏览

hibernate - 无法使用标识列密钥生成( TABLE_PER_CLASS )

com.something.SuperClass:

com.something.SubClass:

给了我这个例外:

我生成 ID 的最佳和最方便的方法是什么?我不想改变我的继承策略。

0 投票
3 回答
737 浏览

database-design - 在超类表中发现一行的子类

我有一个作为通用超类的电子设备表,然后为电话、笔记本电脑、相机等分开子类表,这些表扩展了超类并提供了有关设备的特定信息(使用超类表中的外键 deviceID),换句话说,类表继承。我的问题是,我应该在超类中有一个“deviceType”列吗?这将是多余的,因为您可以通过查看特定 deviceID 出现在哪个子类表中来发现设备类型,但这似乎是不必要的连接数量来找出如此简单的东西。

一般来说,一个人看到一个随机的通用设备并想知道它是什么类型可能是不寻常的,但将设计留在那个人很难轻易发现的地方似乎也很奇怪。

另一个问题是约束......我如何约束它以使设备仅被子类型化一次?例如,如何阻止将具有相同设备 ID 的行添加到膝上型计算机表中,因为该行与 Camera 表中已经存在的行相同?同样,这在良好的 UI 中是不可能实现的,但数据库约束总是更可取的。

谢谢!

PS 如果我们确实使用 deviceType 列,为了帮助数据完整性,它将链接到我们支持的所有设备类型的枚举表,而不是自由文本字段。

为澄清而添加


首先是超类表:

通用设备

这里有两个示例子类:

笔记本电脑

相机

请注意 GenericDevice 表中“deviceID”的迁移键。这允许从通用表到任何子类表的一对一关系,具体取决于它实际上是什么类型的设备。因此,您可以加入这些表格来查看 HP 设备是一台 17 英寸屏幕的笔记本电脑,而佳能和 Ikon 设备都是分别具有 6.5 和 8 兆像素的相机。

问题是如果你一开始不知道设备是什么类型,而你所拥有的只是 GenericDevice 表中的一行。我们以第一行为例。您知道该设备由 HP 制造并于 2009 年 5 月 6 日发货,但您最初并不知道它是什么类型的设备。但是您可以通过搜索子表来找出它,直到找到 deviceID = 1 的行。笔记本电脑表包含这样一行,因此 HP 设备实际上必须是那台笔记本电脑。但这似乎是简单地发现设备类型的不必要麻烦(特别是如果您必须搜索 20 多个子类以查看 deviceID 匹配的位置)。相反,您可以这样做:

通用设备

现在您可以立即查看 HP 设备的类型。但是现在你有重复的数据(隐式)。要了解原因,请考虑用户是否进行了此更改:

通用设备

(第一行的 deviceType 已切换为相机)
现在您的信息存在冲突 - 上表表明 HP 设备是相机,但在笔记本电脑表中有一行设备。换句话说,您实际上将 HP 设备的类型存储了两次。一次使用 GenericDevice 表中的 deviceType 字段,一次简单地因为膝上型计算机表中有一行 deviceID = 1。

0 投票
5 回答
44234 浏览

mysql - 如何在关系数据库中进行继承建模?

我的问题是关于关系数据库系统中的继承建模。我有规范的数据模型,并且我有一些与产品定价相关的字段从产品表中继承某些属性,我想在 MySQL 关系数据库中对这种继承进行建模,所以,

“我们如何在关系数据库中进行继承建模?”

谢谢。

0 投票
0 回答
562 浏览

castle-activerecord - 在 Castle Activerecord 中同时使用类表和单表继承?

在 Castle Activerecord 中(在 NHibernate 之上),是否可以全局使用类表继承,并在部分继承树上使用单表继承?我想做类似的事情

这样所有常见的“东西”(如名称、描述等)都在“模型”表中,但我仍然可以在“容器”表中使用 STI。或者这是浪费时间,我应该去 STI 做整个事情吗?

在此先感谢,吉姆

0 投票
3 回答
13552 浏览

database - 如何在数据库中实现超类、子类关系?

如果我有一个类叫做动物,狗和鱼是子类。动物具有称为“颜色”的属性。狗有“尾长”这个属性,鱼没有这个属性。鱼有“重量”这个属性,狗没有这个属性。

所以,我想设计一个数据库来存储这些信息。我应该怎么办?这里有一些想法:

思路一:做一个动物表,表有类型,找什么动物,如果是狗,就从狗表中得到结果。

动物:颜色:字符串类型:int

类型:狗:0 鱼:1

狗:尾巴长度:int

鱼:重量:int

思路2:数据库中只存储Dog表和Fish表,去掉animal表。

Dog: 颜色: String TailLength: int

鱼:颜色:字符串重量:int

0 投票
2 回答
1598 浏览

php - PHP 学说 1.2 ORM - 具有类表继承的多态查询

我正在试验 PHP 的 Doctrine ORM (v1.2)。我已经定义了一个类“酒”,有两个子类“杜松子酒”和“威士忌”。我正在使用具体继承(大多数文献中的类表继承)将类映射到三个单独的数据库表。

我正在尝试执行以下操作:

最初,我希望 $liquors 是一个包含所有酒的 Doctrine_Collection,无论它们是威士忌还是杜松子酒。但是当我执行代码时,我得到一个空集合,尽管威士忌和杜松子酒数据库表中有几行。根据生成的 SQL,我明白了原因:ORM 正在查询“酒”表,而不是存储实际数据的威士忌/杜松子酒表。

请注意,当我将继承类型切换为列聚合(简单表继承)时,代码可以完美运行。

获得包含所有酒类的 Doctrine_Collection 的最佳方法是什么?

更新

经过一些更多的研究,看起来我期待 DoctrineUNION在幕后执行 SQL 操作以组合来自“威士忌”和“杜松子酒”表的结果集。

这称为多态查询

根据这张票,此功能在 Doctrine 1.x 中不可用。它的目标是 2.0 版本。(另见CTI的 Doctrine 2.0 文档)。

那么根据这些信息,解决这个缺陷的最干净、最有效的方法是什么?切换到单表继承?执行两个 DQL 查询并手动合并生成的 Doctrine_Collections?

0 投票
4 回答
10324 浏览

ruby-on-rails-3 - Rails 3 中的类表继承

我目前正在开发一个 Rails 3 应用程序,它看起来可能需要对几个模型使用类表继承。

这是正在发生的事情的一个简化示例。

我有一个名为 Person 的类,具有名称、电子邮件、密码等通用属性,这些属性对应用程序中的所有类型的人都是通用的,并用于身份验证。

Person 有两个子类(或两种类型的人......),Driver 和Passenger。这两个子类都共享 Person 的通用属性,但具有它们自己独有的特定附加属性。(例如,司机可以拥有许多车辆和执照,但乘客没有)

对于这种情况,我将如何实施 CTI?我一直在查看此处提供的示例:

http://rhnh.net/2010/08/15/class-table-inheritance-and-eager-loading

但它没有推测如何从 Driver 或 Passenger 对象访问 Person 的公共属性,我对此有点困惑。

特别是,我想知道的是:

如果我正在更新驱动程序的属性,如何轻松访问和更新父人员表上的相关属性?我是否必须挂钩 after_save 回调并分离出哪个属性更新去哪里?还是有更好的方法来解决这个问题?

0 投票
7 回答
129350 浏览

sql-server - 如何在数据库中表示继承?

我正在考虑如何在 SQL Server 数据库中表示复杂的结构。

考虑一个应用程序,它需要存储一系列对象的详细信息,这些对象共享一些属性,但还有许多不常见的属性。例如,商业保险套餐可能包括同一保单记录中的责任险、汽车险、财产险和赔偿险。

在 C# 等中实现这一点很简单,因为您可以创建一个包含 Sections 集合的 Policy,其中 Section 是根据各种类型的覆盖物的需要继承的。然而,关系数据库似乎并不容易做到这一点。

我可以看到有两个主要选择:

  1. 创建一个 Policy 表,然后创建一个 Sections 表,其中包含所有必需的字段,用于所有可能的变化,其中大部分为空。

  2. 创建一个 Policy 表和多个 Section 表,每个表对应一种封面。

这两种选择似乎都不能令​​人满意,特别是因为有必要编写跨所有部分的查询,这将涉及大量连接或大量空检查。

这种情况的最佳实践是什么?