Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 使用对象角色建模(ORM)的关系模型中的动态类型_Database_Relational_Database Design_Object Role Modeling - Fatal编程技术网

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

Database 使用对象角色建模(ORM)的关系模型中的动态类型,database,relational,database-design,object-role-modeling,Database,Relational,Database Design,Object Role Modeling,在对象角色建模(ORM)中,给定与类型为的实体有关系的thing实体,并且该类型实体可以指定为生存,并且该thing实体可以有一个出生日期值,如果与thing关联的类型的实例未设置为live,我将如何指定一个约束来排除thing实例的生日值。见下图 我的问题背后的目的是,当不清楚类型是什么,但类型的特征已知时,允许在系统中对类型进行建模。如果你觉得有一种更适用的方法,你的答案不需要是ORM。感谢您的阅读,希望您能帮助我。据我所知,ORM(和)都用于分析业务领域,而不是设计解决方案。在这一层,引

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

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

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


您可以在“is alive”和“has date of birth”之间设置相等约束(带圆圈“=”符号的虚线)。类似于数据库上下文中的“is Tensure”和“is contracted Toll”。

假设您有三个单独的表,我将创建一个函数,用于计算实体与其类型之间联接中的行数。在保存DOB的表格中使用此函数,以确保DOB为空或计数为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

事实上,你的模型有不止一个问题,尽管它很简单。一件东西如果曾经存在过,可能会有它的出生日期。它可能曾经活着,但现在已经死了

此外,您还需要澄清,不存在“类型存在”这一事实是否意味着“类型不存在”(封闭世界假设),还是仅仅意味着“类型不存在”(我认为是开放世界假设)

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


顺便说一句,有关优秀的ORM工具,请参见。它是VisualStudio2005或2008(标准版或更高版本)的附加模块,并使用现代ORM2符号。它可以为几个不同的数据库生成SQL,以及ER图甚至代码


另外,请参见本书:

约翰·桑德斯推荐的那本书是我读过的最好的书之一。而且,你所有的ORM问题都可以通过阅读来回答

不过,为了直接回答您的问题(并避开任何关于模型有效性的问题),我认为有两种明显的方法可以约束它

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

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

在角色之间分配一个子集约束(左),我们可以约束模型,使具有DateOfBirth类型的任何对象都必须是活的类型。这与平等约束不同,它允许事物是活生生的类型,但没有出生日期

新增内容:
为了创建这些类型的子集和等式约束,我们需要使用一种称为。使用连接路径,我们可以创建连接子集约束和连接相等约束,该约束将跨越约束两侧的多个角色。连接路径的定义有时很明显,也很容易遵循。但有时也会变得有点复杂。同样值得注意的是,尽管NORMA确实支持创建连接路径,但在等式、子集和排除约束中,它们的详细化并不是100%完成的,如前所述。这也是当前使用子集更容易的原因之一,因为从概念上验证模型的正确性更容易

要在为子集、相等或排除约束分配角色时在NORMA中创建联接路径,请先单击一次以分配属于路径一部分的所有角色,然后双击以转到下一个路径。当约束能够连接路径时,该约束中涉及的角色将被标记为[#.#],而不仅仅是[#]。因此,当我们创建约束时,我们可以在这里说角色[1.1]&[1.2]是角色[2.1]/[2.1]的子集/相等。请注意,在每个角色中扮演角色的事实也必须匹配。所以他告诉我们诺玛的话:
若某事物有某个诞生日期;有些东西是某种类型的,那么那东西就是某种类型的;那种类型是活的。 更好的说法是:若某种类型的东西有某个出生日期;那就是生活

然而,我们还有第三种(也是更好的)方法来约束它,那就是子类型化。因为有生命的事物和没有生命的事物是非常不同的,所以我们可能不希望将它们映射到相同的表。在这里,我们将类型事实分为两个子类型,有机类型和非有机类型。两种微妙关系之间的排斥或约束