多对多关系表

多对多关系表
多对多关系表

数据库建表-- 一对多/多对一/一对一/多对多关系

关联映射:一对多/多对一存在最普遍的映射关系,简单来讲就如球员与球队的关系;一对多:从球队角度来说一个球队拥有多个球员即为一对多多对一:从球员角度来说多个球员属于一个球队即为多对一数据表间一对多关系如下图:

关联映射:一对一关系就如球队与球队所在地址之间的关系,一支球队仅有一个地址,而一个地址区也仅有一支球队。数据表间一对一关系的表现有两种,一种是外键关联,一种是主键关联。图示如下:

一对一外键关联:

一对一主键关联:要求两个表的主键必须完全一致,通过两个表的主键建立关联关系

关联映射:多对多

多对多关系也很常见,例如学生与选修课之间的关系,一个学生可以选择多门选修课,而每个选修课又可以被多名学生选择。数据库中的多对多关联关系一般需采用中间表的方式处理,将多对多转化为两个一对多。

数据表间多对多关系如下图:

----------------------------------------------------------------------------------------------------------

前言:多对多关系至少需要3个表,我们把一个表叫做主表,一个叫做关系表,另外一个叫做字典表或者副表(字典表是纪录比较少,而且基本稳定的,例如:版块名称;副表是内容比较多,内容变化的,例如)。按照数据库的增删查改操作,多对多关系的查找都可以用inner join或者

select * from 主表where id in (select 主表id from 关系表)

1,角色任命型

特点:关系表两外键组合无重复纪录,关系表一般不需要时间字段和主键,有一个表是字典类型的表。

界面特点:显示主表,用checkbox或多选select设置多选关系。

例如:任命版主(用户表-关系表-版块名称表),角色权限控制等,用户是5个版块版主,只要关系表5行纪录就可以确立,关系表的两个外键具有联合主键性质。

增加关系:如果没有组合纪录,insert之。

删除关系:如果有组合纪录,删除之。

2,集合分组型

特点:同角色任命型类似,关系表两外键组合无重复纪录,关系表一般不需要时间字段和主键。区别是主副表都不是字典表,可能都很大不固定。

界面特点:显示主表,用搜索代替简单的checkbox或多选select,或者一条一条的添加。

例如:歌曲专集(专集表-关系表-歌曲表)。手机分组(分组表-关系表-手机表)。用户圈子(圈子表-关系表-用户表)。文章标签(文章表-关系表-标签表)

增加关系:同版主任命型。

删除关系:同版主任命型。

3,明细帐型

特点:关系表可以有重复纪录,关系表一般有时间字段,有主键,可能还有文字型的字段用来说明每次发生关系的原因(消费)。

界面特点:显示关系表,用radio或下拉设置单选关系。

例如:现金消费明细帐或订单(用户表-订单表-消费原因表),用户可能多次在同一事情上重复消费。积分变化纪录也属于这类。

增加关系:不管有没有组合纪录,insert之,纪录时间。

删除关系:根据关系表PK删除。

4,评论回复型

特点:同明细帐型关系表一般有时间字段,有主键,区别是重点在文字型的字段用来说明每次发生关系的内容(评论回复)。

界面特点:回复文本框。

例如:论坛回复(用户表-回复表-帖子表),用户可能多次在不同帖子上评论回复费。

增加关系:不管有没有组合纪录,insert之,纪录时间和文字。

删除关系:根据关系表(回复表)PK删除。

5,站内短信型

特点:主副表是同一个,关系表一般有时间字段,有主键,重点在关系表文字型的字段用来说明每次发生关系的内容(消息)或者其他标记位来表示文字已读状态时间等。

界面特点:回复文本框。

例如:站内短信(用户表-短信表-用户表),用户可能给用户群发或者单发,有标记位来表示文字已读状态时间等。

增加关系:不管有没有组合纪录,insert之,纪录时间和文字。

删除关系:根据关系表(回复表)PK删除。

6,用户好友型

特点:主副表是同一个,同集合分组型,关系表两外键组合无重复纪录,关系表一般不需要时间字段和主键。

界面特点:同集合分组型,显示主表,用搜索代替简单的checkbox或多选select,或者一条一条的添加。例如:下载站点的文件,(文件表-关系表-文件表)可以被软件工具打开,软件工具本身也是一种文件,可以被下载。用户的好友,也是用户(用户表-好友关系表-用户表)

增加关系:同版主任命型。

删除关系:同版主任命型。

7,未知属性型

特点:在设计初期,主表的某些字段类型和名称是不确定的时候,关系表实际上是主表的可扩展字段,一个[主表](ID),

一个[属性名称表](属性ID.属性名称),

一个[属性值表],包括3个字段:

属性值(属性Value varchar(500))

主表ID

属性ID

这样可以作到最小冗余度。

(和常见的多对多关系不同的是:值统一用varchar来存储,因为这类型的值一般不会用来计算)。

比如:

军队的数据库设计中有种物资叫做“战缴物资”,就是打仗的时候缴获的,军队自己都不知道这些物资有什么属性。

比如缴获的化学品有化学名,通用名,是否有辐射,计量单位,包装规格,数量等等,或者不是化学品是其他任何未知的东西。

这样东西就可以

某奇怪东西.属性集合["某某奇怪属性名"]="某某奇怪值";

某变态东西.属性集合["某某变态属性名"]="某某变态值";

这样存储。

再比如:

手机型号有几千种,除了共同属性外还有不同属性有几百个,属性名和值类型都不一样,有的手机有这属性,有的没有。

对于这样的“多态”,我们就采用上面的设计结构。

其效果相当于:

某奇怪手机.属性集合["某某奇怪属性名"]="某某奇怪值";

某变态手机.属性集合["某某变态属性名"]="某某变态值";

界面特点:设置主表一行纪录的属性时候,要列出所有可能的属性名称,每个对应一个文本框。

经典表关联与多表查询

经典表关联与多表查询 目的: 1.掌握从多个表查询数据的基本知识 2.了解和学习外连接(out join) 3.掌握内连接 授课内容: 1.对多于一个表的数据查询 1.1现实情况中,在数据库应用中,数据存在于多个相关联的表中。基本上没有数据只 存在于一个表中的情况。小的应用系统一般也有十几个表,大型系统一般有上千个表。 1.2你经常要作的就是在多个表中进行数据查询。 1.3Oracle对多表查询使用表连接的技术(table join) 1.4表连接的基本条件: (1)2个表必须有公共字段(同名字段或不同名字段) (2)在一个表中,这个公共字段必须是主键(PK) 1.5二个表中的公共字段,在一个表中是主键,在另外一个表中就是外键(FK)。 1.6二表关联中,公共字段是主键的表称为父表(主表)。是外键的表称为子表(详细 表)。 1.7研究一下scott下的emp和dept表的关系。 1.8研究一下oe下的表: CATEGORIES_TAB CUSTOMERS INVENTORIES ORDERS ORDER_ITEMS PRODUCT_DESCRIPTIONS PRODUCT_INFORMATION 1.9多表查询的语法 select 子句 from 表1[ 别名],表2[ 别名],视图[ 别名],(select 子句)别名 where 连接语句 and 其他条件语句 [oupy by 分类项目] [having 子句] [order by 子句] 1.10任务:查询每个员工的编号,姓名,部门名称,部门位置 select empno,ename, dname,loc from emp a,dept b where=

同步两个数据库中两个表的示例

同步两个数据库中两个表的示例 测试环境及同步要求: 有数据库服务器srv1和srv2,两台电脑能互相访问,有数据 srv1.库名..author有字段:id,name,phone, srv2.库名..author有字段:id,name,telphone,adress 要求: srv1.库名..author增加记录则srv2.库名..author记录增加 srv1.库名..author的phone字段更新,则srv2.库名..author对应字段telphone更新~--*/ --大致的处理步骤 --1.在srv1 上创建连接服务器,以便在srv1 中操作srv2,实现同步 exec sp_addlinkedserver 'srv2','','SQLOLEDB','srv2的sql实例名或ip' exec sp_addlinkedsrvlogin 'srv2','false',null,'用户名','密码' go --2.在srv1 和srv2 这两台电脑中,启动msdtc(分布式事务处理服务),并且设置为自动启动 我的电脑--控制面板--管理工具--服务--右键Distributed Transaction Coordinator--属性--启动--并将启动类型设置为自动启动 go --3.实现同步处理 --a.在srv1..author中创建触发器,实现数据即时同步 --新增同步 create trigger tr_insert_author on author for insert as set xact_abort on --如果执行Transact-SQL 语句产生运行时错误,则整个事务将终止并回滚。 insert srv2.库名.dbo.author(id,name,telphone) select id, name, telphone from inserted go --修改同步 create trigger tr_update_author on author for update as set xact_abort on

数据库表关系模型解析6——多对多

数据库表关系模型解析6——多对多 狼奔代码生成器是一款为程序员设计的前期开发辅助工具,是一个软件项目智能开发的平台,它可以自动生成https://www.360docs.net/doc/116363676.html,页面及后台代码。 实践开发过程中,我们使用PowerDesigner设计数据库模型。狼奔代码生成器就是读取PowerDesigner设计的数据库模型,分析其中的表与表之间的关系模型,分析其中的表和字段的说明信息中的关键字,自动生成不同的页面。 表与表之间的关系模型包括 1.单表数据模型 2.自连接数据模型 3.一对一数据模型 4.一对多数据模型 5.一对多数据模型中的一张表是自连接 6.多对多数据模型 7.多对多数据模型中的一张表是自连接 关键字包括 1.查询 2.状态 3.上传 4.工作流

架构图 数据访问层(DAL) 数据实体Entity Framework 业务实体和校验元数据 业务逻辑层(BLL) 业务处理 工作流 事务 接口层(IBLL)服务契约 展示层(App )View (视图) Controller (控制器) Models (页面实体)对其他系统暴露服务Service (服务) 公共组件 安全组件 日志记录 异常捕获 公共类库(Common) 组件说明

图表1项目组件说明图 1)App——页面展示层 采用MVC框架,使用Jquery脚本库,控件选用Easyui。 2)WcfHost——服务宿主(后期扩展) 为对外的服务提供宿主,使用WCF技术,HTTPS通讯协议。 3)IBLL——业务接口层 业务逻辑层的方法对外暴露的接口和服务契约。 4)BLL——业务逻辑层 业务逻辑的操作,包括业务处理,事务,日志。 5)DAL——数据访问层 数据库访问的操作,数据实体,业务实体,数据校验,使用Entity Framework。6)Common——公共组件层 整个应用程序使用的公共辅助方法。 7)WFActivitys——工作流活动层(后期扩展) 定义了工作流需要的活动,使用微软WF技术。 8)WFDesigner——工作流设计器(后期扩展) 可以让实施人员自由配置工作流的设计器,使用微软WPF技术。 采购计划明细和分发的作用 业务需求:将采购计划明细中的物资分发到不同的站点 采购计划明细和分发之间有一张关联表,这三张表就构成了一个典型的“多对多数据模型” 下面我们以分发为例子分析“多对多数据模型”数据模型,代码已在生成的文件中,并且注释详备,此文不再赘述 数据模型 采购计划明细和分发之间是多对多的关系

多对多关系表

数据库建表-- 一对多/多对一/一对一/多对多关系 关联映射:一对多/多对一存在最普遍的映射关系,简单来讲就如球员与球队的关系;一对多:从球队角度来说一个球队拥有多个球员即为一对多多对一:从球员角度来说多个球员属于一个球队即为多对一数据表间一对多关系如下图: 关联映射:一对一关系就如球队与球队所在地址之间的关系,一支球队仅有一个地址,而一个地址区也仅有一支球队。数据表间一对一关系的表现有两种,一种是外键关联,一种是主键关联。图示如下: 一对一外键关联: 一对一主键关联:要求两个表的主键必须完全一致,通过两个表的主键建立关联关系 关联映射:多对多 多对多关系也很常见,例如学生与选修课之间的关系,一个学生可以选择多门选修课,而每个选修课又可以被多名学生选择。数据库中的多对多关联关系一般需采用中间表的方式处理,将多对多转化为两个一对多。 数据表间多对多关系如下图:

---------------------------------------------------------------------------------------------------------- 前言:多对多关系至少需要3个表,我们把一个表叫做主表,一个叫做关系表,另外一个叫做字典表或者副表(字典表是纪录比较少,而且基本稳定的,例如:版块名称;副表是内容比较多,内容变化的,例如)。按照数据库的增删查改操作,多对多关系的查找都可以用inner join或者 select * from 主表where id in (select 主表id from 关系表) 1,角色任命型 特点:关系表两外键组合无重复纪录,关系表一般不需要时间字段和主键,有一个表是字典类型的表。 界面特点:显示主表,用checkbox或多选select设置多选关系。 例如:任命版主(用户表-关系表-版块名称表),角色权限控制等,用户是5个版块版主,只要关系表5行纪录就可以确立,关系表的两个外键具有联合主键性质。 增加关系:如果没有组合纪录,insert之。 删除关系:如果有组合纪录,删除之。 2,集合分组型 特点:同角色任命型类似,关系表两外键组合无重复纪录,关系表一般不需要时间字段和主键。区别是主副表都不是字典表,可能都很大不固定。 界面特点:显示主表,用搜索代替简单的checkbox或多选select,或者一条一条的添加。 例如:歌曲专集(专集表-关系表-歌曲表)。手机分组(分组表-关系表-手机表)。用户圈子(圈子表-关系表-用户表)。文章标签(文章表-关系表-标签表) 增加关系:同版主任命型。 删除关系:同版主任命型。 3,明细帐型

SQL数据库多表联查等

--单元格中NULL/null/''/' '的区别 select * from [Student] where [Address]='' select [StudentNo] '学号',[Phone] as '电话','性别'=[sex] from [Student] where [sex]='女' select [StudentNo],[Phone] from [Student] where [sex]='女' select [Address] from [Student] where [StudentName] like '张__' and [Sex]='女' select * from [Student] where [BornDate] >'1989/12/31' and [BornDate] <'2000/01/01' and [Sex]='女' select [Student].*,[Grade].[GradeId] from [Student],[Grade] where [Student].[GradeId]=[Grade].[GradeId] and [Grade].[GradeName]='大一' --笛卡尔集(无脑链接,后筛选) select s.* from [Student] s,[Grade] g where s.[GradeId]=g.[GradeId] and g.[GradeName]='大一' --内连接(边链接,边筛选) select s.* from [Student] s inner join [Grade] g on s.[GradeId]=g.[GradeId] where g.[GradeName]='大一' --常量列 select '北京大学' as '学校' from [Student] select TOP 3* from [Student] select * from [Result] order by [StudentResult] desc --三表连查(有语文成绩的学生的学号) select s.* from [Student] s inner join [Result] r on s.[StudentNo]=r.[StudentNo] inner join [Subject] t on r.[SubjectId]=t.[SubjectId] where t.[SubjectName]='语文' --查询按日期由前到后,成绩由高到低,查询参加.net考试的信息 select r.* from [Result] r inner join [Subject] su on r.[SubjectId]=su.[SubjectId] where su.[SubjectName]='.net' order by r.[StudentResult] desc ,r.[ExamDate] --查询年纪最小的学生的姓名和年级 select s.[StudentName],g.[GradeName] from [Student] s inner join [Grade] g on s.[GradeId]=g.[GradeId] where s.BornDate =(select MAX(BornDate) from [Student]) --查询学号为‘20110001’的学生参加过的所有考试信息,并按照实际前后排序

Oracle -Update 多表关联

一条Update更新语句是不能更新多张表的,除非使用触发器隐含更新。而表的更新操作中,在很多情况下需要在表达式中引用要更新的表以外的数据。我们先来讨论根据其他表数据更新你要更新的表 一、MS SQL Server 多表关联更新 sql server提供了update的from 子句,可以将要更新的表与其它的数据源连接起来。虽然只能对一个表进行更新,但是通过将要更新的表与其它的数据源连接起来,就可以在update的表达式中引用要更新的表以外的其它数据。 一般形式: update A SET 字段1=B表字段表达式, 字段2=B表字段表达式 from B WHERE 逻辑表达式 例如: UPDATE dbo.Table2 SET dbo.Table2.ColB = dbo.Table2.ColB + dbo.Table1.ColB FROM dbo.Table2 INNER JOIN dbo.Table1 ON (dbo.Table2.ColA = dbo.Table1.ColA); 实际更新的操作是在要更新的表上进行的,而不是在from子句所形成的新的结果集上进行的 二、Oracle 多表关联更新 Oracle没有update from语法,可以通过两种实现方式: 1、利用子查询: update A SET 字段1=(select 字段表达 式 from B WHERE ...), 字段2=(select 字段表达式 from B WHERE ...) WHERE 逻辑表达式 UPDATE多个字段两种写法:

写法一: UPDATE table_1 a SET col_x1 = (SELECT b.col_y1, b.col_y2 FROM table_2 b WHERE b.col_n = a.col_m), col_x2= (SELECT b.col_y2 FROM table_2 b WHERE b.col_n = a.col_m) WHERE EXISTS(SELECT * FROM table_2 b WHERE b.col_n = a.col_m) 或 UPDATE table_1 a SET col_x1 = (SELECT b.col_y1, b.col_y2 FROM table_2 b WHERE b.col_n = a.col_m), col_x2= (SELECT b.col_y2 FROM table_2 b WHERE b.col_n = a.col_m) WHERE a.col_m=(SELECT b.col_n FROM table_2 b WHERE b.col_n = a.col_m) 写法二: UPDATE table_1 a SET(col_x1, col_x2)= (SELECT b.col_y1, b.col_y2 FROM table_2 b WHERE b.col_n = a.col_m) WHERE EXISTS(SELECT * FROM table_2 b WHERE b.col_n = a.col_m); 或 UPDATE table_1 a SET(col_x1, col_x2)= (SELECT b.col_y1, b.col_y2 FROM table_2 b WHERE b.col_n = a.col_m) WHERE a.col_m=(SELECT b.col_n FROM table_2 b WHERE b.col_n = a.col_m)注意: 1. 对于子查询的值只能是一个唯一值,不能是多值。 2. 子查询在绝大多数情况下,最后面的where EXISTS子句是重要的,否则将得到错误的结果。且where EXISTS子句可用另一方法代替,如上。最后的子句是对a表被更新记录的限制,如无此句,对于a表中某记录,如在b表中关

搞清多表之间的关系

多表之间的关系操作总结 经典例子: 一对一:身份证号码与人 一对多:城市与大学,订单与订单项,部门与员工,班级与学生等等。 多对一:一对多的反面。订单项与订单,大学与城市,员工与公司,学生与班级。多对多:学生与老师 一对多:单向、双向。 一对多关系中单向与双向的区别: 单向体现在程序中就是你可以通过一方得到另一方,但不能通过另一方得到这一方双向就是彼此都能得到对方,相互都有关于对方的一个引用。(外键) 什么时候需要用单向,什么时候需要用双向。 网友答: 只需要从一方获取另一方的数据时就使用单向关联 双方都需要获取对方数据时就使用双向关系 部门---人员 使用人员时 如果只需要获取对应部门信息(user.getDeptarment()) 不需要从部门下的人员信息时,就配置成单向多对一 使用部门时 如果只需要获取部门下人员信息(deptartmanet.getUsers()) 不需要从人员获取部门信息时,就配置成单向一对多 既要获取部门下人员 deptartmanet.getUsers() 又要从人员获取部门信息 user.getDeptarment() 那就配置成双向一对多,也就是双向多一

看需求来配置了。 单向多对一”、“单向一对多,其实概念一样,记得在多的一端配置 双向一对多就是两边都要配,做到你中有我我中有你 弄清楚:关系维护端和关系被维护端。 1—m:多的一方是关系维护端,关系维护端负责外键记录的更新,关系被维护端没有权利更新外键字段。 不管是一对多,还是多对一,外键一定建在多的那方。外键一定是另一张表中已经存在的主键。 关于@mappedBy和@JoinColumn 表示声明一对多关系由对方维护,自己将不再维护,就算在自己这端设置值,保存到数据库后外键依然是null @mappedBy注解的作用:在JPA中,在@OneToMany里加入mappedBy属性可以避免生成一张中间表。 网上: a)只有OneT oOne,OneT oMany,ManyToMany上才有mappedBy属性,ManyToOne不存在该属性; b)mappedBy标签一定是定义在the owned side(被拥有方,也叫关系被维护端,即一的一方),他指向theowning side(拥有方,也叫关系维护端,即多的一方); c)关系的拥有方负责关系的维护,在拥有方建立外键。所以用到@JoinColumn d)mappedBy跟JoinColumn/JoinTable总是处于互斥的一方,可以理解为正是由于拥有方的关联被拥有方的字段存在,拥有方才拥有了被拥有方。mappedBy这方定义JoinColumn/JoinT able总是失效的,不会建立对应的字段或者表。 @JoinColumn所在实体是关系拥有方,name的值即拥有方对应表到参考表的外键名称。@ mappedBy所在实体是关系的被拥有方,value值owner中表示被拥有类的属性。 举例子:创建两个实体类 一对多时,建立实体类时:一的一方需要一个Set或者List集合存储多的对象,多的一方需要定义一个一的对象。需要设置外键的一方需要加上@JoinColoumn注解。 例子: 城市与大学:一对多

Sql语句多表联合查询

Sql语句多表联合查询 查询所要用到的表 1.course表 USE[学生管理] GO /****** Object: Table [dbo].[course] Script Date: 04/28/2015 11:37:12 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE[dbo].[course]( [课号][nvarchar](20)NOT NULL, [课名][char](20)NOT NULL, [类型][char](10)NOT NULL, [学分][int]NOT NULL, PRIMARY KEY CLUSTERED ( [课号]ASC )WITH (PAD_INDEX=OFF,STATISTICS_NORECOMPUTE=OFF, IGNORE_DUP_KEY=OFF,ALLOW_ROW_LOCKS=ON,ALLOW_PAGE_LOCKS=ON) ON[PRIMARY] )ON[PRIMARY] GO SET ANSI_PADDING OFF GO

2.score表 USE[学生管理] GO /****** Object: Table [dbo].[score] Script Date: 04/28/2015 11:38:18 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE[dbo].[score]( [学号][nvarchar](20)NOT NULL, [课号][nvarchar](20)NOT NULL, [考试成绩][decimal](9, 2)NULL, [平时成绩][decimal](9, 2)NULL, PRIMARY KEY CLUSTERED ( [学号]ASC, [课号]ASC )WITH (PAD_INDEX=OFF,STATISTICS_NORECOMPUTE=OFF, IGNORE_DUP_KEY=OFF,ALLOW_ROW_LOCKS=ON,ALLOW_PAGE_LOCKS=ON) ON[PRIMARY] )ON[PRIMARY] GO 3.学生表 USE[学生管理] GO /****** Object: Table [dbo].[student] Script Date: 04/28/2015 11:39:09 ******/ SET ANSI_NULLS ON GO

MySQL数据库多表连接_笛卡尔积

多表关联 内联接 外联接 左外联接 右外连接 全外连接 自然联接 内联接 表1 inner join 表2 on 表1和表2的关联条件 Where 和连接性区别? Where是在from直接取得结果集基础上再使用where条件进行数据过滤(2次)连接性是在from取数据时直接使用on后连接条件进行数据过滤(1次)

交叉集(笛卡尔积) 数据库笛卡尔积什么含义?原理是什么? 假设两个表关联,获取左表数据和右表数据有关联,右表数据也和左表数据有关联的数据。 左外连接 表1 left [outer] outer可省join 表2 on 表1和表2连接条件 假设两个表关联,左表数据全部取出,右表数据只取出和左表数据有关联的数据。

右外连接 表1 right[outer] outer可省join 表2 on 表1和表2连接条件 假设两个表关联,右表数据全部取出,左表数据只取出和右表数据有关联的数据。 Natural 不用写表连接条件,数据库自动匹配 主外键字段名称必须一致

Union all 使用union把两个查询结果集纵向拼接

Select ‘蔬菜’as ‘购物种类’ ,sc_fl as ‘分类’,sc_jg as ‘购买价格’ From sc Union Select ‘调料’as ‘购物种类’,tl_fl as ‘分类’,tl_jg as ‘购买价格’From tl union Select ‘合计’as ‘购物种类’,’’as ‘分类’,sum(test.price) as ‘购买价格’from ( Select ‘蔬菜’,sc_fl,sc_jg as price From sc Union Select ‘调料’,tl_fl,tl_jg as price From tl ) as test

数据库的创建与表间关系的各种操作

学科实验报告 班级2010级金融姓名陈光伟学科管理系统中计算机应用实验名称数据库的创建与表间关系的各种操作 实验工具Visual foxpro 6.0 实验目的1、掌握数据库结构的创建方式 2、表间的关联关系 实验步骤一、建立数据库。 1、在项目管理器中建立数据库。首先选择数据库,然后单击“新建”建立数据库,出现的界面提示用户输入数据库的名称,按要求输入后单击“保存”则完成数据库的建立,并打开i“数据库设计器”。 2、从“新建”对话框建立数据库。单击工具栏上的“新建”按钮或者选择菜单“文件——新建”打开“新建”对话框,首先在“文件类型”组框中选择“数据库”,然后单击“新建文件”建立数据库,后面的操作和步骤与1相同。 3、用命令交互建立数据库。命令是create database【databasename ▏?】 二、表间关系的各种操作。 1、创建索引文件。可以再创建数据表时建立其结构复合索引文件,但是也可以先建立好数据表,以后再创建或修改索引文件。 2、索引的操作。A、打开与关闭。要使用索引,必须先要打开索引。一旦数据表文件关闭所有相应的索引文件也就自动关闭了。B、确定主控索引。可以使用命令确定当前主控索引。命令格式1:set order to 【tag】<索引标识>【ascending| desceding】命令格式2:use<表文件名>order【tag】<索引标识>【ascending | esceding】C、删除索引标识。要删除结构复合索引文件中的索引标识,应当打开数据表文件,并打开其表设计器对话框。在“索引”页面中选定要删除的索引标识后,单击“删除”按钮删除。 3、创建关联。在创建数据表之间的关联时,把当前数据表叫做父表,而把要关联的表叫做子表。必须保证两个要建立关系的数据表中存在能够建立联系的同类字段;同时要求每个数据表事先分别以该字段建立了索引。A、建立表间的一对一的关系。在“数据库设计器”窗口中选择M表中的字段,并按住左键拖到关联表H中对应字段上,放开鼠标左键。这是可以看到在两个表之间的相关字段上产生了一条连线,表明两个表之间已经建立了“一对一”关系。B、建立表间一对多的关系。将M表的名称字段MC设定为主索引,或者候选索引;H表中的JG字段已经设置成普通索引。在“数据库设计器”窗口中将MC字段拖到关联表中对应字段JG上,放开鼠标左键。这时可以看到在两个表之间的相关字段上产生了一条显然与“一对一”关联不同形式的连线,表明两个表之间已经建立了“一对多”关系。 4、调整或删除关联。A、删除关联。在数据库设计器对话框窗口中,首先必须用鼠标左键单击关联线,该连线变粗了说明它已被选中。如果要删除可敲【del】。也可以单击鼠标右键在弹出对话框窗口中单击“删除关联”选项。B、编辑关联。在数据库设计器对话框窗口中,首先必须用鼠标左键单击关联线,该连线变粗了说明已被选中。在主菜单“数据库”选项的下拉菜单中的“编辑关系”选项,也可以单击鼠标右键在弹出对话框窗口中单击“编辑关系”选项。 5、设置数据表之间的参照完整性。在对数据库表建立关联关系后,就可以设置两个相关数据表之间操作的有效性原则。这些规则可以控制相关表中的记录的插入、删除或修改。

一对多的自身关联

一对多的自身关联 一的一方和多的一方都属于同一个类 这种结构就类似于树状结构 每一个对象内部本身包括 一个父节点对象(此时这个原本的对象对于这个父节点对象是多对一的关系) 一个子节点的集合(此时这个对象对于子节点集合来说又是一对多的关系) 创建表 create table creature( id bigint primary key, name varchar(15), parent_creature_id bigint ); 一对一关联第一种关联方式通过一个表的主键由另一个表来产生 第一张表 create table husband( id varchar(100) primary key,

name varchar(100) default '' )character set utf8 collate utf8_general_ci;---能插入中文字符 create table wife( id varchar(100) primary key, name varchar(100) default '' )character set utf8 collate utf8_general_ci; Husband.hbm中uuid方式产生主键 在wife hbm中

mysql 多表联合查询

mysql 多表联合查询 Mysql多表查询,多表插入和多表更新 2010年8月27日星期四 11:24 A.M. /*************************************by garcon1986*****************************************************/ 多表查询: CREATE TABLE IF NOT EXISTS contact( contact_id int(11) NOT NULL AUTO_INCREMENT, user_name varchar(255), nom varchar(255), prenom varchar(255), mail varchar(64), passcode char(64), PRIMARY KEY(contact_id) ); CREATE TABLE IF NOT EXISTS droit( droit_id int( 11 ) NOT NULL AUTO_INCREMENT , droit varchar(255), PRIMARY KEY(droit_id) ); CREATE TABLE IF NOT EXISTS contactdroit( contactdroit_id int(11) NOT NULL AUTO_INCREMENT, contact_id int( 11 ), droit_id int( 11 ), PRIMARY KEY( contactdroit_id ) ); Insert into contact(contact_id, user_name) values(1,'user1'); Insert into contact(contact_id, user_name) values(2,'user2'); Insert into contact(contact_id, user_name) values(3,'user3'); Insert into droit(droit_id, droit) values(1,'admin'); Insert into droit(droit_id, droit) values(2,'superuser'); Insert into contactdroit(contact_id, droit_id) values(1, 1); Insert into contactdroit(contact_id, droit_id) values(2, 1); Insert into contactdroit(contact_id, droit_id) values(3, 2); SELECT c.contact_id, d.droit_id, d.droit FROM contact c, contactdroit cd, droit d where c.contact_id = cd.contact_id and cd.droit_id = d.droit_id; 结果: contact_id droit_id droit 1 1 admin 2 1 admin

多对一,一对多

例: Person表和Dept部门表 一个部门里可以有多个person 一对多的关系 多个person可以属于同一个部门多对一的关系 public class Person { private Integer id; private String name; private int sex; private String degree; private Date birthday; private int salary=10000; private Dept dept; //与Dept表的关联 } public class Dept { private Integer id; private String deptName; private Set personSet; //某个部门下的所有人员的集合 需要用set进行存储, Set persons = new HashSet(); } Person.hbm.xml配置 Cascade : all: 所有情况下均进行关联操作,即save-update和delete。

none: 所有情况下均不进行关联操作。这是默认值。 save-update: 在执行save/update/saveOrUpdate时进行关联操作。 delete: 在执行delete 时进行关联操作。 Dept.hbm.xml Lazy延迟加载机制 lazy延时加载 lazy概念只有真正使用该对象时,才会创建对象,对于hibernate而言,真正使用的时候才会发出sql语句hibernate lazy策略可以使用在: 标签上,可以取值:true/false 标签上,可以取值:true/false需要类增强工具 标签上,可以取值:true/false/extra 单端关联上,可以取值:false/proxy/noproxy 标签中的lazy属性标签中的lazy属性,默认是true,即开启延时加载当使用get或者是load方法查询返回实体对象时,并不会发出SQL语句,只有使用对象的时候才会发出SQL语句可以把lazy设置为false,禁止延时加载 标签lazy示例 public class TestLazyClass { public static void main(String[] args) { Session session = HibernateSessionFactory.getSession(); Transaction tx = session.beginTransaction();

数据库表连接(内外、左右连接)

数据库表连接类型 一、SQL中的表连接 在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行查询。 连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM 子句中指出连接时有助于将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 SQL-92标准所定义的FROM子句的连接语法格式为: FROM join_table join_type join_table [ON (join_condition)] 其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以 对多表操作,对同一个表操作的连接又称做自连接。 join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN)和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连 接不同的是,外连接不只列出与连接条件相匹配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的数据行。 交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡 尔积,其结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的 列和比较运算符、逻辑运算符等构成。 无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接连接。 下面结合案例说明,假设有如下表:

数据库设计多对多关系的几种形态

数据库设计多对多关系的几种形态(转) 前言:多对多关系至少需要3个表,我们把一个表叫做主表,一个叫做关系表,另外一个叫做字典表或者副表(字典表是纪录比较少,而且基本稳定的,例如:版块名称;副表是内容比较多,内容变化的,例如)。按照数据库的增删查改操作,多对多关系的查找都可以用inner join或者select * from 主表where id in (select 主表id from 关系表) 1,角色任命型 特点:关系表两外键组合无重复纪录,关系表一般不需要时间字段和主键,有一个表是字典类型的表。 界面特点:显示主表,用checkbox或多选select设置多选关系。 例如:任命版主(用户表-关系表-版块名称表),角色权限控制等,用户是5个版块版主,只要关系表5行纪录就可以确立,关系表的两个外键具有联合主键性质。 增加关系:如果没有组合纪录,insert之。 删除关系:如果有组合纪录,删除之。 2,集合分组型 特点:同角色任命型类似,关系表两外键组合无重复纪录,关系表一般不需要时间字段和主键。区别是主副表都不是字典表,可能都很大不固定。 界面特点:显示主表,用搜索代替简单的checkbox或多选select,或者一条一条的添加。 例如:歌曲专集(专集表-关系表-歌曲表)。手机分组(分组表-关系表-手机表)。用户圈子(圈子表-关系表-用户表)。文章标签(文章表-关系表-标签表) 增加关系:同版主任命型。 删除关系:同版主任命型。 3,明细帐型

特点:关系表可以有重复纪录,关系表一般有时间字段,有主键,可能还有文字型的字段用来说明每次发生关系的原因(消费)。 界面特点:显示关系表,用radio或下拉设置单选关系。 例如:现金消费明细帐或订单(用户表-订单表-消费原因表),用户可能多次在同一事情上重复消费。积分变化纪录也属于这类。 增加关系:不管有没有组合纪录,insert之,纪录时间。 删除关系:根据关系表PK删除。 4,评论回复型 特点:同明细帐型关系表一般有时间字段,有主键,区别是重点在文字型的字段用来说明每次发生关系的内容(评论回复)。 界面特点:回复文本框。 例如:论坛回复(用户表-回复表-帖子表),用户可能多次在不同帖子上评论回复费。 增加关系:不管有没有组合纪录,insert之,纪录时间和文字。 删除关系:根据关系表(回复表)PK删除。 5,站内短信型 特点:主副表是同一个,关系表一般有时间字段,有主键,重点在关系表文字型的字段用来说明每次发生关系的内容(消息)或者其他标记位来表示文字已读状态时间等。 界面特点:回复文本框。 例如:站内短信(用户表-短信表-用户表),用户可能给用户群发或者单发,有标记位来表示文字已读状态时间等。 增加关系:不管有没有组合纪录,insert之,纪录时间和文字。 删除关系:根据关系表(回复表)PK删除。 6,用户好友型

SQL 数据库多表连接详细讲解

SQL多表连接 应用背景 数据库是由多张表组成的存储结构,并通过多张表之间的关系建立起完整的有效的数据存储形式,形成关系型数据库。作为数据查询语言SQL,提供了功能强大的数据表连接查询功能,使多张表格之间形成有效的数据联系,使得关系数据库在大型数据库应用中占据了主角地位。 一个普通的大型数据库应用程序所使用的数据库中,有多达几百张表的数据,那么如何将这些表高效的有机的联系起来,就成为设计关系数据库的一个重要指标。优良的数据库设计指标包括: 1.减少数据冗余,去除掉多余的数据冗余,可以通过建立表之间的连接关系完成。 2.数据更新正确,不能因为表之间存在关系后,使得更新记录出现不正常的数据。 3.添加数据正常,添加数据过程中,应该保持数据表之间的关系,确定表之间的连接。 4.查询简便灵活,在建立数据连接的查询过程中,连接清晰简便,操作灵活准确。 数据库设计是应用软件成功与否的一项重要标志。设计数据库,除与系统分析结果,设计员的水平等有关外,还可以参考一些规范的设计范式,下面简单介绍数据库的2个基本设计范式: 1.第一范式:要求表的每列都是不可再分的简单数据项,所以1对N 关系就必须用多表表示,而不能用一张表表示。 2.第二范式:表中的每一个非主键列必须完全函数依赖于主键,就是说表中除主键之外的其他列,都必须通过主键能够唯一确定。 数据库的设计非常复杂,没有一成不变的东西,需要就地取材,解决问题,简单化问题。 知识要点 (1) 传统连接 连接就是将多个表中的数据连接到一起的查询,即连接操作可以在一个Select语句中完成从多个表中查找和处理数据,使用连接时可以使用名字相同的不同表的列,也可以不同,但要求连接的列不需可连接,即数据类型相同。 传统的连接语法如下: Select * from Tblname1 T1,Tblname2 T2 where T1.column=T2.column 连接SQL语句的明显标志为在From子句后边,有多个表Tblname1,

相关文档
最新文档