一、前言
在数据库设计中,Hibernate,iBatis等ORM框架的使用中经常听说主键,外键,主表,从表,关联表,父表,子表之类的术语,弄懂它们之前的区别与联系对于数据库设计和ORM框架的学习使用是非常有必要的。
二、概述
下面从数据库设计角度,ORM框架使用(以Hibernate为例),PowerDesigner软件以及实际业务角度进行一下介绍。
(1) 数据库角度而言
主键:一般情况下,满足第一范式的表都有一个主键Primary key,用于唯一标示数据库中的一个字段。
外键:外键是相对于数据库设计中的参考完整性而言,它与主键之间是彼此依赖的关系。假设现在有两个表,产品分类表ProductCategory(主键CategoryId)和产品信息表Product(主键ProductId),每类产品都属于一个分类。那么如果产品信息表肯定需要参考产品分类表进行定义。因为如果没有产品分类表,又何谈产品分类呢。所以产品信息表Product需要引用ProductCategory中的主键CategoryId 进行产品分类定义,Product表中引用CategoryId的字段就是外键。
在概念模型(Concept Model)中,从产品分类角度看,产品分类和产品之间就是一对多的关系,一个分类下可以有多个产品。从产品角度看,产品和产品分类之间是多对一的关系,多种产品属于一个分类。
主表:在数据库中建立的表格即Table,其中存在主键(primary key)用于与其它表相关联,并且作为在主表中的唯一性标识。(摘自百度百科)
从表:以主表的主键(primary key)值为外键 (Foreign Key)的表,可以通过外键与主表进行关联查询。从表与主表通过外键进行关联查询。(摘自百度百科)
关联表:两个数据库及其(数据)表之间的数据的相互依赖和影响关系。
比如现有某学校三个数据表:学生(学号,姓名),课程(课程名,课程编号),选课(学号,课程 号,成绩)。选课表中的“学号”,“课程号”必须是另外两个表中存在的数据,才有意义;而且一旦另外两表中的某一学生或课程被删除,选课表中的相应学号或 课程号必须自动删除。这就是一种关联关系。它实际上是保证数据完整性的一种做法.
父表,子表的说法其实在PowerDesigner中解释可能更加恰当,这里就不多说了。
(2)从ORM框架来看
Hibernate的主表从表请参照:
http://www.iteye.com/problems/31280
关联表: 在Hibernate的关联关系中,存在着多对多的关联,但是实际情况下,我们是很少使用多对多关联的,因为它的查询效率很低(http://zhidao.baidu.com/question/244432511.html)。
举个例子,一个订单可以订多个产品,一个产品也可以出现在多张订单。很明显,一个多对多的关系,因为效率问题,我们必须将它分解成两个1对多的关系,所以,必须添加一个中间表,也就是关联表,用来保存两个表的主键,从而实现多对多关系的分解。
(3)PowerDesigner
一个截图,足以说明一切了,多的也不用举例,上面的单词相信大家还是可以看懂的。
(4)实际业务功能
关于这个业务功能,不多介绍了,从网上截取了一个不错的例子,大家可以看一下,介绍的非常不错。
班级:Class 学生:Student
Class的表结构
id int identity,
name varchar
Student
id int identity,
name varchar,
classId int refrence Class ('id')
Student 中classId引用Class,一个班级中可能有多个学生,那么此时可以说Class是主表,Student是Class的从表,从hibernate的角度看,Student和Class是一个many-to-one的关系。
不过主表和从表是相对的,没有绝对的,比如,老师和学生的关系,一个老师有多个学生,一个学生同时也有多个老师,这时如果以老师为主表,那学生就是从表,一学生为主表,那老师就是从表。
如何确定主表和从表?
则完全取决于业务,业务上的主体就是主表,比如软件A是为老师而设计,用于管理学生的,那老师就是主表,软件B是为家长设计,用于管理老师的,那学生就是主表。主表和从表没有绝对,完全取决业务上的重心。
相信看了上面的介绍,大家都这些概念也大致的所有了解了。把这些基本概念弄懂对于学习ORM框架是非常重要的。
相关推荐
父表中的外键,是子表中的主键。在父表中的外键,可以出现多次。主键是不能有重复的。
使用ireport jasperreport 三级(父-子-孙)关联报表的制作和输出,版本号4.7.0,直接导入eclipse即可。 依次选择: File > import > General > Existing Projects into Workspace > Select archive file >压缩包。
Jira ScriptRunner脚本-根据子任务修改父任务自定义字段状态
两个表,1个作为父表 一个子表 ,在字表中患有父结构的,查询出树状结构, 需要父查子,子查父,递归查
删除表不是特别常用,特别是对于存在外键关联的表,删除更得小心。...这是因为你尝试删除的表中的字段被用作了其他表的外键,因此在删除这个表(父表)之前必须先删除具有外键的表(子表)。也就是说,
好像版本是2.4.6
RESTRICT和NO ACTION相同, 是指限制在子表有关联记录的情况下, 父表不能更新; CASCADE表示父表在更新或者删除时,更新或者删除子表对应的记录; SET NULL 则表示父表在更新或者删除的时候,子表的对应字段被SET...
使用Inventor进行零件间关联设计的研究,姚叶明,,本文给出了三种在Autodesk Inventor平台上进行零部件设计时零件间关联设计表达的方法,探讨典型零部件在进行零件间参数化关联设计的技�
Java创建产生关联的主窗体与子窗体,使用的结构是JDesktopPane-JInternalFrame。JDesktopPane 相当于一个“父窗口”,可以拥有多个作为“子窗口”的JInternalFrame 对象。如运行截图所示,当选中Option 菜单下的...
element的el-tree多选树(复选框)父子节点关联不关联 属性check-strictly 官方文档提供...若点击子节点,子节点部分勾选时父节点处于半选状态,子节点全部勾选时父节点选中,子节点全部不勾选时父节点未选中。 设置t
父模块 尝试git子模块作为“父模块”
表结构: Id ParentId 1 0 2 1 3 2 …… 针对该表结构解释如下: 1的父节点为0, 2的父节点为1, 3的父节点为2 …… 以此类推,要求给定一个父节点的值,比如1, 用SQL语句查询的到该父结点下的所有子节点...
对于数据表之间关联冗余的字段,需要与源数据表中的字段类型、长度保持一致,如 :船舶信息表中有"船舶编号VESSEL_CD"字段,在合同、航次任务等相应的业务表 中都会冗余"船舶编号VESSEL_CD",此时合同、航次任务表...
父关联子,子不关联父
c#多个窗体,只有一个主窗体(父窗体)
3.1 设计表间关系:列出父表与子表的关联索引,指出要建立的表间关系的类型。 3.2 完整性设计:列出主要字段完整性的字段名、完整性约束条件;列出记录完整性约束及其约束条件;列出参照完整性表。
自己做的,例子包含数据,导入oracle就可。调试的时候,改一下连接的数据库。就可看到效果。可实现模糊查询,颜色隔行显示以及如何传参到JasperServer等等。
对于两个通过外键关联的表,相关联字段中主键所在的表是主表,也称之为父表,外键所在的表是从表,也称之为子表,定义外键的时候需要遵守几个规则: 1、父表必须已经存在于数据库中,或者是当前正在创建的表。如果是...
MFC计算器小程序控件关联double变量 对于初学者认识控件的使用还是有帮助的
sql联合查询的详细讲解 select * from 表A,表A子表 where 表A.FileCode = 表A子表.FileCode and 表A.ID in (select 表A子表.ID from 表A子表 ...这个查询的条件在子表,而结果在父表,没用关联查询,直接查询2个表