3

我想知道是否有一种干净的方式来表示 is-a 关系,如下例所示:

该数据库存储三种类型节目的录制时间:电影、游戏节目、戏剧。在面向对象的意义上,这些中的每一个都是一个程序。这些子类中的每一个都有不同的属性。以下是表格(fk 前缀表示外键):

电影
ID
名称
fkDirector

gameShow
id
name
fkHost
fkContestant


_

在 OO 术语中,记录表看起来像这样:

record
id
fkProgram
startTime
endTime

在不违反常规形式的情况下,我能想到的唯一方法是拥有三个记录表,即 recordMovierecordGameShowrecordDrama

有没有办法在不违反数据库规范化原则的情况下将这些表合并为一个?

以下是一些无效的示例来说明这个想法:

程序
id
fkMovie
fkGameShow
fkDrama

该表违反了第一范式,因为它将包含空值。对于每一行,3 个条目中只有一个不为空。

program
id
fkSpecific ← fkMovie OR fkGameShow OR fkDrama
fkType ← 将指示要查看的表

在这里,我将无法强制执行参照完整性,因为 fkSpecific 可能指向三个表之一。

我只是想节省在这里有 3 个表而不是一个的开销。也许这根本不适用于 RDB。

4

6 回答 6

2

是的,那应该是一张桌子

Programs:
   id,
   name,
   type_id,
   length,
   etc...

如果有与该类型相关的其他数据位,则带有程序类型的参考表:

ProgramType
   type_id,
   type_name,
   etc...

像那样。

于 2008-09-24T21:55:59.687 回答
2

为什么要将所有数据存储在一个表中?它们显然是不同的实体。您对主Record表的想法,以及辅助recordMovierecordGameShowRecordDrama

要强制辅助表和主表之间的“is-a”关系,您需要将 Record.id 声明为所有这些表中的外键,并为其添加一个约束以使其唯一 - 这会强制执行一对一的关系,它将这些表转换为主表的扩展。

您还需要在主记录表中添加一个新字段以指示它是哪种记录(电影、游戏节目、戏剧,还是其他?)。这可以是对另一个表(RecordTypes?)的外键引用,也可以是字符串(在它可以接受的值上定义了一个约束)。

于 2008-09-24T23:02:06.830 回答
2

在“泛化专业化关系建模”上进行谷歌搜索。

“gen-spec”模型遵循与“is-a”关系相同的模式。

例如,汽车是专用车辆。卡车是一种不同的专用车辆。摩托车是第三种专用车辆。

你应该找到很多文章。

有趣的是,如果您只是在“gen-spec”上进行谷歌搜索,那么最重要的链接之一就是 Smalltalk 中对 gen-spec 建模的描述。

于 2009-02-08T05:44:35.997 回答
1

这是许多人以前面临的一个相当标准的问题,您可能考虑的所有方法可能已经在某一时刻完成。

一个简单的谷歌搜索就可以很好地解释每种方法的优缺点。

于 2008-09-24T21:57:33.180 回答
0

这些都是关于这个主题的好文章:http:
//www.ibm.com/developerworks/library/ws-mapping-to-rdb/
http://www.agiledata.org/essays/mappingObjects.html

这就是我最终要做的。我的程序表将是:

节目
编号

然后我将 fkProgram 添加到每个子类(戏剧、游戏节目和电影)中。这样,程序表将成为子类之间的中间表。我可以使用 Program 表的外键来引用任何子类的实例。这将允许我有一个单一的记录表并且不违反任何正常形式。

电影
id fk 节目 名称
fkDirector


记录
id
fkProgram
startTime
endTime

于 2008-09-25T14:43:47.893 回答
0

我的第一个想法也是为电影、节目和戏剧使用一个节目表。然后添加一个 ProgramType 表并像父帖子一样对其使用外键。

可以添加其他列,例如 fkDirector、fkMovie。然后添加一个约束,当 ProgramType 是电影时,fkDirector 不能为空,或者当它是节目时,fkHost 不能为空。

这允许轻松查找在开始和结束日期之间记录的所有电影/节目/...。还要确保填写所有数据并且参考正确。

有人有更好的主意吗?

于 2008-09-24T22:07:04.777 回答