65.9K
CodeProject 正在变化。 阅读更多。
Home

二进制关系建模

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2011年9月9日

CPOL

10分钟阅读

viewsIcon

17602

数据库建模的一种替代方法。

引言

这里介绍的 BRM 版本是一个概念,用于定义和直观表示集合以及这些集合元素之间的关系。通过添加唯一性约束的实现,BRM 可以在 (编程语言 + SQL) 平台中扮演 SQL 的角色。BRM 还可以为通用知识库表示提供一些基础。此外,通过添加对集合元素动态性的支持,BRM 可以用作完整编程范式的基础。为了简单起见,只有两种不同的构建组件:集合和命名二进制关系。这两种组件几乎足够构建复杂的、反映不同集合之间绑定关系的复杂数据定义。BRM 图的真正价值在于其简洁性,同时提供了足够的表达能力来进行复杂的数据定义。为了让您对 BRM 图的样式有所了解,图 1 展示了一个描述组织及其人员的图表示例。

_1_BRM-organization.png

图 1

如果您熟悉关系数据库

BRM 中使用的关系实际上是多对一关系。除了常规使用外,它们还可以用于表示表及其列的定义。事实证明,多对多和一对一关系也可以使用 BRM 关系来表示。多对多关系可以通过使用中间集合和一对互补的 BRM 关系来表达(有经验的数据库用户会熟悉这种技术)。一对一关系也可以通过类似于多对多关系的方式来表达,但需要一些唯一性约束。

基础

在我们深入讨论之前,让我们先看另一个 BRM 图的例子。图 2 定义了一个简化的文章发布数据库。

_2_BRM-Article.png

图 2(BRM 图示例)

正如我们所见,只有两种不同的构建组件:命名的圆角矩形和命名的箭头。这些命名的圆角矩形代表 **集合**,命名的箭头代表 **命名二进制关系**(以下简称二进制关系)。这些集合是一些元素的命名集合。BRM 图仅显示集合的概念及其二进制关系,而不显示集合的单个元素。

两个集合上的二进制关系是一种声明两个参与集合之间存在绑定的概念。二进制关系由其名称标识。每个二进制关系还有一个方向,由一个箭头表示,指向从一个集合到另一个集合。我们将说每个二进制关系 *“**将集合元素** 从其**源集合** **关联到** 其**目标集合**”*,其中源集合和目标集合由箭头方向假定。

观察箭头的方向,一个关系允许将源集合的任何元素与目标集合的任何一个元素进行绑定。在图 1 中,集合 *Person* 是二进制关系 *name* 和 *surname* 的源集合。这意味着每个人最多只能有一个名字和一个姓氏,两者都用某种文本表示。同样,每篇文章可以关联到一个 *author*、*title*、*description* 和 *content* 实例。

反向观察箭头的方向,可以从另一个角度理解源集合和目标集合。我们已经知道源集合的每个元素可以指向目标集合的一个元素。但是,也可能多个源集合元素指向同一个目标集合元素。这是一个非常重要的点,即在源集合和目标集合之间建立了**多对一**绑定。如果我们看看二进制关系 *author*,我们会发现该关系以集合 *Article* 为源,目标为集合 *Person*。这意味着任何数量的文章都可以有同一个作者(一个人)。

关系问题

BRM 图中集合之间的二进制关系实际上代表了经典的许多对一关系,就像它看起来一样简单。因此,我们可以得出结论:支持多对一关系。

在现实世界中,也存在多对多类型的绑定。分析图 2 时,我们可以看到每篇文章只有一个作者。但实际上,每篇文章可以由多个作者贡献,而每个作者可以参与撰写多篇文章。这就需要在相关集合之间建立多对多绑定,而不是当前的多对一绑定。BRM 的核心只有一个类型的关系,代表多对一绑定。但是,这些关系可以组合成一个等同于多对多绑定的组合。这种绑定可以通过引入一个新的集合和两个新的二进制关系来表达。新集合将成为新二进制关系(它们将指向原始绑定集合)的源。在图 3 中,为了将二进制关系 *author* 升级为多对多绑定,引入了以下新组件:集合“*Author*”以及关系“*represented by*”和“*wrote*”。新集合 *Author* 是其新二进制关系(指向 *Person* 和 *Article* 集合)的源,在这些集合之间形成了多对多绑定。

_3_BRM-manytomany.png

图 3(多对多关系)

在定义多对多绑定时,有时我们需要为每个绑定附加额外信息。例如,经典的教师-班级授课数据库,每个教师可以教多个班级,而每个班级可以由多个教师授课。我们可能需要额外的信息,例如教师需要与每个班级进行多少次课程。BRM 能够以核心级别处理此要求,如图 4 所示。

_4_BRM-teaching.png

图 4(又一个多对多关系示例)

一对一关系可以像多对多关系一样存储在中间集合中,但需要限制其两个二进制关系的唯一性。稍后我们将讨论唯一性约束。

那么 n-ary 关系呢?是的,它们也以一种方式得到支持,即将每个 n-ary 关系转换为等效的二进制关系组合。图 5 展示了如何实现这一点。

_5_BRM-n-ary.png

图 5(表示 n-ary 关系)

有时需要定义递归二进制关系。这些本质上是普通的二进制关系,具有相同的集合作为源和目标。图 6 提供了一个示例。

_5_BRM-recursive.png

图 6(递归关系)

为了测试 BRM 概念的完整性,我们可以看一下 BRM 定义本身。假设必须存在一个初始的原始集合 Text,其中包含数据终结点。从图 7 可以看出,BRM 能够进行这样的定义。

_6_BRM-BRM.png

图 7(自定义定义)

集合作为元素

如果我们考虑将集合作为其他集合的元素,就可以在定义知识金字塔方面达到一个非常重要的点。这一点使我们能够选择同一集合中包含的不同形式的数据。例如,一个人可以是主人或客人,根据其角色具有不同的附加描述。如图 8 所示。

_7_BRM-SetsAsElems.png

图 8(集合作为元素)

图 8 显示了一些集合作为二进制关系 *species* 和 *tourism role* 的目标集合的元素。对于某个人,如果我们选择 *Female* 作为物种,我们可以访问两个附加的二进制关系:*orientation* 和 *radiation*。相反,如果我们选择 *Male* 作为物种,我们可以访问 *has beard* 作为附加的二进制关系。类似地,集合 *Guest* 和 *Host* 定义了它们自己的附加规范。在这里,我们努力将集合的元素带入 BRM 图。

查询元素的接口

一个集合可以有任意数量的元素,这些元素可以通过某种查询表达式来枚举。查询集合元素的表达式应包含用于选择元素范围的语法。查询可以实现为布尔表达式,该表达式可以为给定集合的每个元素进行测试,只过滤掉符合规则的元素。查询可以构成二进制关系的目标集合,从而允许自动生成依赖于所需规则的集合内容。例如,获取某个国家宾客列表的查询可能如下所示。

SELECT Person WHERE (tourism role == Guest) AND 
   (tourism role.country == "some country")

通过这类查询,还应该可以获取以集合内容中的语义表形式存储的函数结果。这些查询可以被视为表达式,随着查询参数随时间变化而自动计算其值。因此,查询为我们提供了描述相互依赖表达式的可能性。

关于唯一性约束

对特定二进制关系相对于某个源集合的唯一性进行可视化表示可能会使 BRM 图变得复杂,而 BRM 图的主要优点在于其简洁性。然而,元素的唯一性可能在定义集合时非常重要。唯一性的特定实现可以通过多种不同的方式进行,涵盖不同的唯一性约束发生规则。甚至可以指定关系元素的数量或条件唯一性。由于唯一性问题的极端复杂性,此处 BRM 图中将不进行标准化。程序员应以他们认为最方便的方式来实现唯一性。

关于集合的元素

元素可以被认为是保持与其他元素的关系绑定的概念。每个元素都可以指定其集合中源出的每个二进制关系。从某个集合源出的二进制关系实际上定义了该集合中包含的元素的格式。

集合还可以有一个修改其内容的接口。此接口可以包含插入、修改和删除元素的命令。

集合可以用三种不同的方式使用

  • 如果一个集合代表来自某个外部系统(例如键盘)的输入,那么它的元素可以直接从外部系统更新。这些更改可以被查询并用于更新其他集合。当输入集合被修改时,可以生成用于检测数据更改的事件。
  • 集合也可以代表输出到某个外部系统(例如屏幕)。外部系统可以持续监视输出集合元素的更改,并根据输出集合内容的变化采取行动。
  • 最后,作为从输入系统到输出系统的绑定,可以定义一些内部集合。这些内部集合可以被修改和查询,以根据输入系统调整输出系统。

我们可以说,集合的二进制关系定义是集合元素所表示的动态数据的静态方面。集合也可以是其他集合的元素。在这种情况下,作为元素的集合在其结构上可以被改变,从而提供了集合定义的动态性。

修改元素的接口

修改集合内容的表达式应包含添加、修改和删除集合元素的概念。这些表达式应该能够反映数据的动态性。我们将修改元素的表达式称为操作。与某个集合相关的每个操作都应该定义一个触发该操作的事件。事件应为布尔表达式的形式,当表达式从 false 变为 true 时,可以生成事件。由事件触发的操作使我们能够表达和记忆副作用并提供数据动态性。

结论

通过添加一些查询数据的语法,BRM 可以在 (编程语言 + SQL) 平台中扮演 SQL 的角色。该概念也可以启发自动生成处理记录的最终用户界面。更乐观地说,通过添加一些修改集合元素的语法,BRM 可以代表一个全新的编程范式的基础。BRM 留下了良好的印象,但无法预测实际情况将如何发展。该概念是否会在实际应用中实现?这可能取决于某个个人程序员,他可能主观或不主观地尝试一下。

© . All rights reserved.