当前位置: 首页 > news >正文

一个经典的建模问题

我们在建模时最常见的关系是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="https://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>

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 清华大学计算机杨弋,[转载]专注与兴趣是成功的阶梯(访杨弋)
  • SD2China大会杂记
  • 浪潮服务器修改ipmi账号密码,浪潮IPMI管理软件 实现运维精控化
  • 戴尔R410服务器系统安装,Dell服务器R410
  • 希赛长沙部分顾问南郊公园烧烤活动
  • 云平台服务器外呼系统,呼叫中心系统的搭建费用是多少?-捷讯通信
  • 好东西,大家共享
  • 积目服务器维护,搭建经济高效的制作网络服务器群试验平台
  • ARP欺骗病毒
  • 河北科怡档案管理系统连接服务器,档案信息管理系统web端使用说明.docx
  • 购买服务器有系统吗,购买服务器是否带操作系统
  • 构建基于MVC+Observer模式的、艺术性的移动开发框架(KJAVA版)(二)
  • 拉结尔6月21日服务器维护,《拉结尔》6月19日换端更新公告
  • 厦门主要IT企业名单(至20071205)
  • 跨机器访问SQL SERVER数据库
  • 网络传输文件的问题
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • 03Go 类型总结
  • 0基础学习移动端适配
  • gitlab-ci配置详解(一)
  • Javascript弹出层-初探
  • java第三方包学习之lombok
  • jdbc就是这么简单
  • js递归,无限分级树形折叠菜单
  • SSH 免密登录
  • SwizzleMethod 黑魔法
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 浏览器缓存机制分析
  • 我有几个粽子,和一个故事
  • 写代码的正确姿势
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • ​HTTP与HTTPS:网络通信的安全卫士
  • # Panda3d 碰撞检测系统介绍
  • # 达梦数据库知识点
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #数据结构 笔记一
  • ${factoryList }后面有空格不影响
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (创新)基于VMD-CNN-BiLSTM的电力负荷预测—代码+数据
  • (二十三)Flask之高频面试点
  • (十)c52学习之旅-定时器实验
  • (未解决)macOS matplotlib 中文是方框
  • (已解决)什么是vue导航守卫
  • (转)EXC_BREAKPOINT僵尸错误
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • .a文件和.so文件
  • .bashrc在哪里,alias妙用
  • .net 7 上传文件踩坑
  • .NET CORE Aws S3 使用
  • .NET Reactor简单使用教程
  • .NET 发展历程
  • .NET 设计模式—简单工厂(Simple Factory Pattern)
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比