`
izuoyan
  • 浏览: 9222522 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

一个经典的建模问题

阅读更多

我们在建模时最常见的关系是one-to-one,one-to-many,many-to-one等,最近我注意到一个问题,就是两个实体同时存在one-to-manyone-to-one关系,而且这种两种关系也是有联系的,那会产生什么样的问题呢?这就是我写这篇文章的目的

考虑这种一个场景:部门与员工的关系,一个部门有多个员工,一个员工属于一个部门,这是双向one-to-many关系;同时部门中有个员工为主管,且一个员工只能为一个部门的主管。这是one-to-one关系,而且这个one-to-one关系是以前面那个one-to-many为基础的。

这里我提供几种建模方式作为讨论:

第一种,最简单的方式,建立隐式的one-to-one的关系,这种方式的缺点,不好做O-R映射,至少,我目前还想不到怎么用hibernate annotation来实现。

<shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/wangjian5748/Snap2.jpg"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 155.25pt; HEIGHT: 165pt" type="#_x0000_t75"><imagedata o:title="" src="file:///C:%5CDOCUME~1%5CADMINI~1%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image001.png"></imagedata></shape>

<shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 155.25pt; HEIGHT: 165pt" type="#_x0000_t75"><imagedata o:title="" src="file:///C:%5CDOCUME~1%5CADMINI~1%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image001.png"></imagedata></shape>

第二种,通过一个中间表来建立one-to-one关系,与第一种比,这个好写O-R映射文件,不过,从数据建模的角度看,没有体现出one-to-one的关系是建立在one-to-many基础之上,这只能由程序员在编程代码中来实现,尤其是,若想获得某个部门的所有员工时,就要查询两张表

<shape id="_x0000_i1026" style="WIDTH: 278.25pt; HEIGHT: 232.5pt" type="#_x0000_t75"><imagedata o:title="" src="file:///C:%5CDOCUME~1%5CADMINI~1%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image003.png"><font face="宋体" size="3"></font></imagedata></shape>

第三种,与第二种相似,就是把部门主管表改为部门员工表,第二种方式以已部门为中心,这种方式以员工为中心,而且这种方式与第二种比较会有较大性能损失,尤其在部门员工数比较多的时候

<shape id="_x0000_i1027" style="WIDTH: 290.25pt; HEIGHT: 230.25pt" type="#_x0000_t75"><imagedata o:title="" src="file:///C:%5CDOCUME~1%5CADMINI~1%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image005.png"><font face="宋体" size="3"></font></imagedata></shape>

第四种,就是在部门中建一个指向员工表的外键(“主管”),这种方式有个缺点,就是在生成数据库时,会产生“鸡生蛋”与“蛋生鸡”的问题。而且,我一直认为这种问题在数据建模时,应该严格避免的

<shape id="_x0000_i1028" style="WIDTH: 248.25pt; HEIGHT: 201.75pt" type="#_x0000_t75"><imagedata o:title="" src="file:///C:%5CDOCUME~1%5CADMINI~1%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image007.png"><font face="宋体" size="3"></font></imagedata></shape>

我自己目前采用第二种方式,大家可以讨论哪种方式比较好

分享到:
评论

相关推荐

    经典数学建模选区划分问题

    数学建模选区划分经典题解答

    数学建模 送货路线问题

    数学建模中的送货路线问题是一个典型的组合优化问题,涉及到如何设计最有效的配送路径,以减少时间和资源的消耗。本文主要探讨了四种不同的场景,并提出了相应的建模方法。 首先,第一问涉及的是经典的旅行商问题...

    数学建模经典教材(各种经典)

    《数学建模经典教材》是一本集合了多种数学建模领域的精华内容的教材,它涵盖了数学建模的各种经典方法和应用。在数学建模中,我们利用数学工具和理论来研究现实世界的问题,通过建立数学模型,对问题进行量化分析,...

    MATLAB数学建模经典案例实战教学PPT (1)_matlab_Matlab数学建模教程_matlab教程_数学建模_

    第12章——物价预测问题,是统计建模的一个实例。MATLAB可以用来处理时间序列数据,进行趋势分析、季节性调整和预测。学习者将学会如何运用MATLAB构建预测模型,如ARIMA模型,以预测未来物价变化,这对经济决策和...

    数学建模分酒问题

    **分酒问题**是一个经典的智力挑战题目,其核心在于通过有限的操作步骤(即“倒酒”),将给定数量的酒瓶从一种状态转换到另一种指定的状态,并寻求最少的操作次数。 **问题一**描述了具体情境下的分酒问题:假设有...

    数学建模商人过河问题

    标题中的“数学建模商人过河问题”是一个经典的逻辑或数学谜题,通常涉及最少步骤或最优化策略的问题。在数学建模中,这类问题可以通过不同的数学工具来解决,例如图论、动态规划或者简单的搜索算法。MATLAB作为一种...

    数学建模 运输问题 最优化 产销问题

    在数学建模中,运输问题是运筹学领域的一个经典模型,它主要应用于解决资源分配、物流调度等实际问题。这个模型假设有一批货物需要从多个产地运送到多个销地,目标是在满足供需平衡的同时,最小化运输成本。在这个...

    数学建模 装箱问题PPT课件.pptx

    这个问题是一个经典的组合优化问题,有着广泛的应用,在日常生活中也屡见不鲜。 装箱问题的描述: 设有许多具有同样结构和负荷的箱子B1,B2,…,其数量足够供所达到目的之用。每个箱子的负荷(可为长度、重量等)...

    数学建模装箱问题PPT学习教案.pptx

    数学建模装箱问题PPT学习教案 数学建模装箱问题是一种经典的组合...数学建模装箱问题PPT学习教案提供了一个系统的学习平台,通过对装箱问题的描述、应用、求解方法等方面的讲解,帮助学生更好地理解和应用装箱问题。

    数学建模国赛优秀论文集锦-一类运输问题的建模.zip

    总之,“数学建模国赛优秀论文集锦-一类运输问题的建模”是一个宝贵的学习资源,它展示了如何用数学工具解决实际问题,对于学习运筹学、优化理论和管理科学的学生及从业者具有很高的参考价值。通过深入研究这些论文...

    数学建模经典的例题第几个

    这是一个优化问题,涉及到林业资源的可持续管理。目标是最大化砍伐树木的经济价值,同时保持森林总量不变。可以建立线性规划模型来解决,其中变量表示每年砍伐的树木数量,目标函数表示经济价值,约束条件包括森林...

    经典建模《谢金星优化建模与LINGO

    《谢金星优化建模与LINGO》是一本专注于数学建模和优化技术的书籍,旨在帮助读者高效地学习和应用这些理论与方法。优化建模是数据分析、工程设计、经济预测等领域的重要工具,它通过数学模型来描述复杂的问题,并...

    建模经典教材《很齐全》

    总的来说,《建模经典教材《很齐全》》这套资源为学习者提供了数学建模的全方位指导,不仅教授理论知识,还强调实践应用和问题解决能力的培养。无论是对于学术研究还是职业发展,都是一份不可多得的学习资料。

    数学建模的几个小经典例子

    在上述的几个经典例子中,我们可以看到数学建模是如何被用来解决实际问题的。 首先,旅馆收入优化问题是一个典型的二次函数优化问题。经理想要最大化旅馆的总收入,这涉及到房价和住房率之间的关系。通过观察不同...

    数学建模的旅行商问题

    旅行商问题(Traveling Salesman Problem, TSP)是组合优化领域的一个经典问题,也是计算机科学中的一项重要研究课题。TSP的问题描述为:给定一组城市以及每对城市间的距离,在所有访问每个城市恰好一次并最终返回...

    数学建模经典集合数学建模经典集合

    在数学建模领域,经典集合的概念是至关重要的基础,它为理解和解决各种实际问题提供了理论框架。数学建模是将现实生活中的复杂问题转化为数学模型,然后通过数学工具进行分析和求解的过程。在这个过程中,集合论是...

    旅行商问题数学建模[整理].pdf

    该问题是一个经典的组合优化问题,广泛应用于物流、交通、运输等领域。 数学模型: 设 G = (V, E) 为带权图,其中 V = {v1, v2, …, vn} 是图中的顶点,E 是图中的边。每条边 (vi, vj) 都有一个权值 cij,表示从...

    数学建模钢材切割问题使用c++实现的程序

    动态规划是解决这类问题的经典方法,通过构建一个表格,存储前i段钢材能产生的最大收益,逐步求出全局最优解。贪心策略则是在每一步选择当前看起来最好的决策,但不保证全局最优。 "steel"和"steel_2"可能分别代表...

    数学建模经典例题

    建模就是运用数学的思想方法、数学的语言去近似地刻画一个实际研究对象,构建一座 沟通现实世界与数学世界的桥梁,并以计算机为工具应用现代计算技术达到解决各种实 际问题的目的。建立一个数学模型的全过程称为数学...

    数学建模经典模型汇总

    这个名为“数学建模经典模型汇总”的压缩包文件,显然为初学者提供了一个全面的学习资源,涵盖了基础的数学建模模型。以下是对这些模型的详细介绍: 1. **线性规划**:线性规划是最基础的优化模型之一,用于在满足...

Global site tag (gtag.js) - Google Analytics