使用对象角色建模(ORM)的关系模型中的动态类型

问题描述 投票:3回答:4

在对象角色建模(ORM)中,给定与类型实体有关系的事物的实体,并且可以指定类型实体生存,并且事物实体可以具有出生日期的值,我将如何指定如果与thing相关联的类型的实例未设置为live,则会排除thing的实例与出生日期的值相关的约束。见下图...

ORM Diagram of Model to be constrained http://img197.imageshack.us/img197/6551/dynamictypeorm.jpg

我的问题背后的目的是允许在不清楚类型是什么时对系统内的类型进行建模,但是已知类型的特征。如果您觉得有更适用的方法,您的答案不需要是ORM。感谢阅读,希望你能帮助我。

database relational database-design object-role-modeling
4个回答
4
投票

约翰桑德斯推荐的那本书是我读过的最好的书之一。此外,您的所有ORM问题最有可能通过阅读来回答。

为了直接回答你的问题,(并回避任何关于模型有效性的问题),我认为有两种明显的方法可以将其约束。

我们可以使用子集约束或等式约束,具体取决于您实际想要捕获的内容。

在角色之间分配一个等式约束(右),我们可以生成一个约束,在概念上要求生活类型的任何东西都有出生日期,并且任何具有出生日期的东西都是活的类型。

在角色之间分配子集约束(左),我们可以约束模型,使得任何具有DateOfBirth的Type的Thing必须是生存的Type。与平等约束不同,这将允许事物成为活生生的类型,但没有生育日期。

alt text

补充: 要创建这些类型的子集和相等约束,我们需要使用一个名为'Join Path'的东西。使用连接路径,我们可以创建一个Join-Subset Constraint和Join-Equality约束,它将跨越约束两侧的多个角色。连接路径的Examples有时很明显且易于遵循。但有时也可以得到一点overwhelming和复杂。另外值得注意的是,虽然NORMA确实支持创建连接路径,但在相等,子集和排除约束条件下,verbila化对它们来说并非100%完整,正如here所解释的那样。这也是为什么在当前使用子集更容易的原因之一,因为从概念上更容易验证模型的正确性。

要在为子集,等式或排除约束分配角色时在NORMA中创建联接路径,首先只需单击一次即可分配路径一部分的所有角色,然后双击以转到下一个路径。当约束能够连接路径时,该约束中涉及的角色将被标记为[#。#],而不仅仅是[#]。因此,当我们创建约束时,我们可以在这里说角色[1.1]和[1.2]是一个子集/等于角色[2.1] / [2.1]。请注意,在每个角色中扮演角色的事实也必须匹配。所以他们从NORMA得到了一个语言表达: 如果有些东西有一些DateOfBirth;有些东西是某种类型然后东西是某种类型;那种类型就是生活。哪个更好地说明:如果某些类型的某些东西有一些DateOfBirth;那个类型就是生活。

alt text

但是,有第三种(也是可取的)方式我们可以限制这种方式,这将是子类型。由于活着的东西和不活跃的东西是非常不同的,我们可能不希望将它们映射到相同的表格。在这里,我们将Type事实分为两个子类型,OrganicTypes和NonOrganicTypes。两种子类型之间的排他或约束告诉我们每种类型都是有机的或非有机的。并且Note告诉我们用于确定类型属于哪个组的派生规则。从那里,我们将[Thing is of Type]角色重新定义为[LivingThing是OrganicType]。而且由于OrganicThings by definition能够生命,我们对DOB /生活的约束现在已经被建立在模型中。

alt text


2
投票

实际上,您的模型存在多个问题,即使它很简单。如果它曾经存在,那么它可能有一个出生日期。它可能曾经生活过,但现在已经死了。

此外,你要澄清是否缺少“类型生活”这一事实意味着“类型不生活”(封闭世界假设),或者它是否只暗示“不知道生活类型”(Open World Assumption,I认为)。

我有一个额外的担忧是你的问题似乎有些混淆,将“关系模型”和“ORM”结合在同一个“句子”中。对象角色建模是一种用于创建概念模型的概念建模工具,然后可以将其映射到关系模式。即使您正在对现有的Relational模式进行逆向工程,最好将模式用作仅用于创建正确的Conceptual模型的信息的一部分。此外,使用有效输入和输出的示例,以及与域专家的讨论。这通常可以帮助您发现关系模式未捕获的重要约束,或者可能未正确捕获的重要约束。


顺便说一句,对于一个优秀的ORM工具,请参阅NORMA。它是Visual Studio 2005或2008(标准版或更高版本)的加载项,并使用现代ORM2表示法。它可以为几个不同的数据库生成SQL,以及ER图甚至代码。


另外,请参阅书:


0
投票

在数据库上下文中,假设您有三个单独的表,我将创建一个函数来计算实体及其类型之间的连接中的行数。在包含DOB的表中使用此函数以确保DOB为null或计数为1。

伪代码:

 function fn_count_living(id)
     declare @count int
     select @count = count(*)
     from entities inner join types on entities.typeid = types.id
     where entities.id = id and types.living = 1
     return @count
 end

约束

 fn_count_living(entity_id) = 1 or dob is null

0
投票

据我所知,ORM(和domain model)都是conceptual model,用于分析业务领域,而不是设计解决方案。在这一层,引入“类型”或“动态类型”等概念还为时过早,并不适合模型的目的。

来自Object Role Modeling: An Overview

alt text http://i.msdn.microsoft.com/Aa290383.dv_vsea_ormoverview_06%28en-us,VS.71%29.gif

你可以在“生存”和“生日期”之间加上一个等式约束(带有圆圈“=”符号的虚线)。类似于“终身”和“承包直到”。

© www.soinside.com 2019 - 2024. All rights reserved.