多对多、多对一、一对多
07Mybatis的多表查询1----1对多和多对1---@Results注解用法总结
07Mybatis的多表查询1----1对多和多对1---@Results注解⽤法总结1.表与表之间的关系及其举例表之间的关系有4种:⼀对多、多对⼀、⼀对⼀、多对多。
举例: (1)⽤户和订单就是⼀对多 ⼀个⽤户可以下多个订单 (2)订单和⽤户就是多对⼀ 多个订单属于同⼀个⽤户 (3)⼈和⾝份证号就是⼀对⼀ ⼀个⼈只能有⼀个⾝份证号 ⼀个⾝份证号只能属于⼀个⼈ (4)⽼师和学⽣之间就是多对多 ⼀个学⽣可以被多个⽼师教过 ⼀个⽼师可以交多个学⽣2.mybatis中的多表查询⽰例:⽤户和账户 ⼀个⽤户可以有多个账户 ⼀个账户只能属于⼀个⽤户(多个账户也可以属于同⼀个⽤户)步骤: 1、建⽴两张表:⽤户表,账户表 让⽤户表和账户表之间具备⼀对多的关系:需要使⽤外键在账户表中添加 2、建⽴两个实体类:⽤户实体类和账户实体类 让⽤户和账户的实体类能体现出来⼀对多的关系 3、建⽴两个配置⽂件 ⽤户的配置⽂件 账户的配置⽂件 4、实现配置: 当我们查询⽤户时,可以同时得到⽤户下所包含的账户信息 当我们查询账户时,可以同时得到账户的所属⽤户信息3.@Results注解⽤法总结:MyBatis中使⽤@Results注解来映射查询结果集到实体类属性。
(1)@Results的基本⽤法。
当数据库字段名与实体类对应的属性名不⼀致时,可以使⽤@Results映射来将其对应起来。
column为数据库字段名,porperty为实体类属性名,jdbcType为数据库字段数据类型,id为是否为主键。
@Select({"select id, name, class_id from my_student"})@Results({@Result(column="id", property="id", jdbcType=JdbcType.INTEGER, id=true),@Result(column="name", property="name", jdbcType=JdbcType.VARCHAR),@Result(column="class_id", property="classId", jdbcType=JdbcType.INTEGER)})List<Student> selectAll();如上所⽰的数据库字段名class_id与实体类属性名classId,就通过这种⽅式建⽴了映射关系。
数据库实体间一对多(多对一)、多对多关系处理
数据库实体间⼀对多(多对⼀)、多对多关系处理
数据库实体间有三种对应关系:⼀对⼀,⼀对多,多对多。
⼀对⼀关系⽰例:⼀个学⽣对应⼀个学⽣档案材料,或者每个⼈都有唯⼀的⾝份证编号。
⼀对多关系⽰例:⼀个学⽣只属于⼀个班,但是⼀个学院有多名学⽣。
多对多关系⽰例:⼀个学⽣可以选择多门课,⼀门课也有多名学⽣。
这三种关系在数据库中逻辑结构处理分析:
1.⼀对多关系处理:
我们以学⽣和班级之间的关系来说明⼀对多的关系处理⽅法。
假设现有基本表学⽣表(学号,姓名,……),班级表(班级号,备注信息,……)。
⽅法⼀:
新增⼀个关系表,⽤来表⽰学⽣与班级的属于关系,该关系表包含字段(学⽣号,班级号)。
通过学⽣号与班级号的对应关系表⽰学⽣属于的班级。
⽅法⼆:
在学⽣表中新增字段(班级号),该字段作为学⽣表的外键与班级表中的班级号关联。
每⼀个学⽣实体在班级号字段的值,表⽰该学⽣属于的班级。
⼩结:⼀般情况下,⼀对多关系采⽤⽅法⼆来处理。
⼀对多的两个实体间,在“多”的实体表中新增⼀个字段,该字段是“⼀”实体表的主键。
2.多对多关系处理:
在多对多关系中,我们要新增加⼀个关系表。
如在上⾯⽰例中,在学⽣表和课程表的基础上增加选课表来表⽰学⽣与课程之间的多对多关系。
在选课表中,必须含有的属性有学⽣号和课程号。
(学⽣号,课程号)这个属性集刚好也就是选课表的关键字。
搭配不当之一对多、多对多 一面对两面
2、当今世界,自主知识产权所占比 重是衡量一个国家科学发展水平的标 志,而科学技术进步与否是国家富强 的标志。
3、投资环境的好坏,服务质量的 优劣,政府公务人员素质的高低, 都是地区经济健康发展的重要保证。
注意:并非一出现单个两 面词,句子就一定会有 语病。一定要谨慎地加 以判断。
例题:判断下列语句是否有一面
D全球温室气体减排无论幅度大小,都为减缓地球温 度不断上升和海平面持续上涨提供了可能。
学生总结(谈收获)
看并列 词语 句子中一旦出现表并列的词 或标点符号,如: “和”“与”“及”“同”“ 跟”等词或顿号时,
我们就要注意判断其前后词语 是否搭配。
看肯定与否定、正面 与反面相叠的短语
句子中出现“能否”“能不能”
搭配不当的类别
1 主谓搭配不当 2 主宾搭配不当 3 动宾搭配不当 4 修饰成分与中心词搭配不当 5 关联词搭配不当 6 一面与两面搭配不当 7 并列短语做句子成分搭配不当(一
对多、多对多)
一、“一对多”“多对多” 的搭配不当
例题引路
1、战士们冒着滂沱的大雨和泥泞 的小路快速前进。
2、春风一阵阵吹来,树枝摇曳着, 月光、树影一齐晃动起来,发出沙 沙的响声。
2、在社会交际中,无论个人还是 组织,在公众中的信誉是至关重要 的,它是决定交际成败的关键。
3、学生素质的高低对他们走出校 门适应社会有重要影响,所以,全面 提高学生素质是教育的根本。
常见的隐性两面词: “心情”、 “进程”、“信誉”、“影响”、 “作用”、“质量”、“力度” 等。这些词本身就有好坏高低等 意义。
对两面的搭配不当的错误,并说出 理由。
1、居住环境的好坏,将直接 影响居民的心情。
2、是否解放思想,关系到改革开 放的进程。
数据库-一对一、一对多、多对一、多对多关系
数据库-⼀对⼀、⼀对多、多对⼀、多对多关系
⼀对多关系、多对⼀关系和⼀对⼀关系
1. ⾄少都有⼀侧是单个实体,所以记录之间的联系通过外键实现,让外键指向这个实体。
2. 实现这种关系时,要在“多”这⼀侧加⼊⼀个外键,指向“⼀”这⼀侧联接的记录。
多对多关系
1. 解决⽅法是添加第三个表,这个表称为关联表。
2. 多对多关系可以分解成原表和关联表之间的两个⼀对多关系
多对多关系例⼦
查询多对多关系要分成两步。
1. 若想知道某位学⽣选择了哪些课程,要先从学⽣和注册之间的⼀对多关系开始,获取这位学⽣在 registrations 表中的所有记录。
2. 然后再按照多到⼀的⽅向遍历课程和注册之间的⼀对多关系,找到这位学⽣在 registrations 表中各记录所对应的课程。
3. 同样,若想找到选择了某门课程的所有学⽣,你要先从课程表中开始,获取其在 registrations 表中的记录,再获取这些记录联接的学⽣。
⾃引⽤关系也是多对多的⼀种特殊情况
如果关系中的两侧都在同⼀个表中,这种关系称为⾃引⽤关系。
在关注中,关系的左侧是⽤户实体,可以称为“关注者”;关系的右侧也是⽤户实体,但这些是“被关注者”。
举例说明一对一,一对多,多对多关系
举例说明一对一,一对多,多对多关系一对一、一对多和多对多关系是数据库中常见的关系模型,用于描述数据实体之间的关联。
下面将分别以不同领域的实例来说明这三种关系模型。
一对一关系:1. 身份证和个人:一个人只能拥有一个身份证,而一个身份证也只能属于一个人。
2. 学生和班主任:一个学生只能有一个班主任,而一个班主任也只能负责一个学生。
3. 用户和手机号码:一个用户只能绑定一个手机号码,而一个手机号码也只能被一个用户绑定。
4. 员工和档案:一个员工只有一个档案,而一个档案也只能对应一个员工。
5. 作者和书籍:一个作者只能创作一本书籍,而一本书籍也只能由一个作者创作。
一对多关系:1. 学校和学生:一个学校可以有多个学生,但一个学生只能属于一个学校。
2. 部门和员工:一个部门可以有多个员工,但一个员工只能属于一个部门。
3. 班级和学生:一个班级可以有多个学生,但一个学生只能属于一个班级。
4. 作者和书籍:一个作者可以创作多本书籍,但一本书籍只能由一个作者创作。
5. 电视剧和演员:一部电视剧可以有多个演员,但一个演员只能参演一部电视剧。
多对多关系:1. 学生和课程:一个学生可以选择多门课程,一门课程也可以有多个学生选择。
2. 顾客和商品:一个顾客可以购买多个商品,一个商品也可以被多个顾客购买。
3. 音乐家和乐器:一个音乐家可以演奏多种乐器,一个乐器也可以被多个音乐家演奏。
4. 饭店和菜品:一个饭店可以供应多种菜品,一种菜品也可以在多个饭店供应。
5. 作家和书籍:一个作家可以创作多本书籍,一本书籍也可以由多个作家创作。
以上是一对一、一对多和多对多关系的举例,它们在实际应用中具有广泛的应用。
在数据库设计和数据处理中,合理地使用这些关系模型可以更好地组织和管理数据。
数据库在一对一、一对多、多对多怎么设计表关系
数据库在⼀对⼀、⼀对多、多对多怎么设计表关系1、⼀对⼀可以两个实体设计在⼀个数据库中l例如设计⼀个夫妻表,⾥⾯放丈夫和妻⼦2、⼀对多可以建两张表,将⼀这⼀⽅的主键作为多那⼀⽅的外键,例如⼀个学⽣表可以加⼀个字段指向班级(班级与学⽣⼀对多的关系)3、多对多可以多加⼀张中间表,将另外两个表的主键放到这个表中(如教师和学⽣就是多对多的关系)关于外键的设置:⾸先,外键引⽤的那个列在主表中必须是主键列或者唯⼀列。
所以1:n的肯定把外键建⽴在n的那张表上。
1:1,⼀般要看谁是主表,谁是附属表,外键当然建⽴在附属表中。
n:m的情况,需要建⽴⼀个关系表,两个原表和其关系分别是1:n,1:m关于主外键及多表联系的进⼀步理解:主外键的存在是依托两个实体之间的关系⽽存在的;⽐如班级与学⽣的关系:⼀个班级可以有多个学⽣,并且⼀个学⽣只能属于⼀个班级,这就是⼀对多的关系;那么设计数据库的时候就应该在学⽣表内存放班级的ID作为外键,为什么不在班级表内放学⽣呢?因为,你想⼀想班级表内如果放学⽣那么记录可能就是这样:1班ID 1班 xx同学id1班ID 1班 xx同学id..这是不允许的,班级表内班级为主键,是唯⼀的不允许相同记录的;下⾯简单讲下⼤概建成的表结构--建班级表create table class(classid int primary key,--定义班级ID为主键classname varchar(15))--建学⽣表create table students(studentid int primary key,--定义学⽣ID为主键classid int ,--外键值,跟班级表classid 属性类型相同stuname varchar(20),--学⽣姓名---定义外键foreign key(classid) references class(classid) --本表classid是基于class表classid的外键)---------如上定义了主外键后,两个表间的关系就是⼀对多的关系了,并且学⽣表内的classid必须依托班级表的classid存在,也就是说外键必须要主键存在的时候才能创建,例如:--在班级表为空的情况往学⽣表插⼊⼀条记录是不允许的:insert into students(studentid,classid,stuname)values(1,1,'⼩明')系统会抛出异常提⽰主键表班级表内班级ID不存在这样是不允许插⼊的;必须要先往班级表内插⼊⼀条记录:insert into class(classid,classname)values(1,'⼀班')后才能执⾏插⼊前⾯⼀条往学⽣表插⼊信息的语句..。
搭配不当之一对多、多对多 一面对两面
教学目标
1、学会辨析搭配不当的两 种类别:“一对多、多对 多”“一面对两面” 。 2、能够改正 “一对多、多 对多”“一面对两面” 的搭 配不当的病句 。
• 《考试说明》规定的病句类型 为以下六项: • 语序不当 • 搭配不当 • 成分残缺或赘余 • 结构混乱 • 表意不明 • 不合逻辑
4.这个文化站已成为教育和帮助后进青 年,挽救和培养失足青年的场所,多次受 到上级领导的表彰。(93′全国卷)
5、卫生部发出紧急通告,要求消 费者和食品经营机构要停止销售和 食用美国的两种花生酱。
二、“一面对两面” 的搭配不当
两面词是指一个词语兼有相反的两 方面意思,如“成败”、“得失”、 “能否”、“好坏”、“高低”、 “是否”、“大小”等。 因为它们表达的是不固定的两个 方面的意思,所以它一般要求语句 的上下文应有与之相照应的词语或 语义,否则会造成语义上的不对称。
3、学生素质的高低对他们走出校 门适应社会有重要影响,所以,全面 提高学生素质是教育的根本。
常见的隐性两面词: “心情”、 “进程”、“信誉”、“影响”、 “作用”、“质量”、“力度” 等。这些词本身就有好坏高低等 意义。
高考模拟练习
下列各句中,没有语病的一句是( D ) A随着生活水平和生活节奏的加快和提高,关注大众 的身体健康,增强民众的自我保健意识则显得越来 越重要。 B语文课堂其实就是微缩的社会言语交际场,学生在 这里学习将来步入广阔社会所需要的言语交际本领 与素养。 C国际消费者对中国商品品牌的认知,是随着众多中 国企业与中国品牌走向世界而完成的,那么是否能 形成一个世界级的品牌集群将决定着企业的成功、 国家的富强。 D全球温室气体减排无论幅度大小,都为减缓地球温 度不断上升和海平面持续上涨提供了可能。
数据库中表的一对多、多对多、一对一关系等
数据库中表的⼀对多、多对多、⼀对⼀关系等外键前戏之⼀对多关系"""把所有数据都存放于⼀张表的弊端1.组织结构不清晰2.浪费硬盘空间3.扩展性极差"""# 上述的弊端产⽣原因类似于把代码全部写在⼀个py⽂件中,你应该怎么做?>>>解耦合!将上述⼀张表拆成员⼯和部门两张表!# 类似的表关系学⽣与班级,也是如此,⼀张学⽣表和⼀张班级表# 分析表数据之间的关系:多个⽤户对应⼀个部门,⼀个部门对应多个⽤户。
禁⽌⼀个⽤户对应多个部门这种情况是另外⼀张表关系# 如何查找表与表之间的关系"""⽼师与课程表1.站在⽼师表的⾓度:⼀名⽼师能否教授多门课程(限制死,不能,⼀名⽼师只能教python,不能同时教python和linux)2.站在课程表的⾓度:⼀门课程能否可以被多个⽼师教,完全可以!那就是课程表多对⼀⽼师表,如何表⽰这种关系?在课程表中创建⼀个字段(tea_id)指向⽼师表的id字段学⽣与班级表1.站在学⽣表的⾓度:2.站在班级表的⾓度:那就是学⽣表多对⼀班级表,如何表⽰这种关系?在学⽣表中创建⼀个字段(class_id)指向班级表的id字段"""# 再回过头来看员⼯与部门表,我员⼯表⾥⾯的dep_id我可以随意更改,但是应该有⼀个强制限制,限制dep_id字段必须只是部门表已有的id字段才合理⼀对多(Foreign Key)# foreign key会带来什么样的效果?# 1、在创建表时,先建被关联的表dep,才能建关联表empcreate table dep(id int primary key auto_increment,dep_name char(10),dep_comment char(60));create table emp(id int primary key auto_increment,name char(16),gender enum('male','female') not null default 'male',dep_id int,foreign key(dep_id) references dep(id));# 2、在插⼊记录时,必须先插被关联的表dep,才能插关联表empinsert into dep(dep_name,dep_comment) values('sb教学部','sb辅导学⽣学习,教授python课程'),('外交部','⽼男孩上海校区驻张江形象⼤使'),('nb技术部','nb技术能⼒有限部门');insert into emp(name,gender,dep_id) values('alex','male',1),('egon','male',2),('lxx','male',1),('wxx','male',1),('wenzhou','female',3);# 当我想修改emp⾥的dep_id或dep⾥⾯的id时返现都⽆法成功# 当我想删除dep表的教学部的时候,也⽆法删除# ⽅式1:先删除教学部对应的所有的员⼯,再删除教学部# ⽅式2:受限于外键约束,导致操作数据变得⾮常复杂,能否有⼀张简单的⽅式,让我不需要考虑在操作⽬标表的时候还需要考虑关联表的情况,⽐如我删除部门,那么这个部门对应的员⼯就应该跟着⽴即清空# 先把之前创建的表删除,先删员⼯表,再删部门表,最后按章下⾯的⽅式重新创建表关系# 3.更新于删除都需要考虑到关联与被关联的关系>>>同步更新与同步删除create table dep(id int primary key auto_increment,dep_name char(10),dep_comment char(60));create table emp(id int primary key auto_increment,name char(16),gender enum('male','female') not null default 'male',dep_id int,foreign key(dep_id) references dep(id)on update cascadeon delete cascade);insert into dep(dep_name,dep_comment) values('sb教学部','sb辅导学⽣学习,教授python课程'),('外交部','⽼男孩上海校区驻张江形象⼤使'),('nb技术部','nb技术能⼒有限部门');insert into emp(name,gender,dep_id) values('alex','male',1),('egon','male',2),('lxx','male',1),('wxx','male',1),('wenzhou','female',3);# 删除部门后,对应的部门⾥⾯的员⼯表数据对应删除# 更新部门后,对应员⼯表中的标⽰部门的字段同步更新多对多# 图书表与作者表之间的关系"""仍然站在两张表的⾓度:1.站在图书表:⼀本书可不可以有多个作者,可以!那就是书多对⼀作者2.站在作者表:⼀个作者可不可以写多本书,可以!那就是作者多对⼀书双⽅都能⼀条数据对应对⽅多条记录,这种关系就是多对多!"""# 先来想如何创建表?图书表需要有⼀个外键关联作者,作者也需要有⼀个外键字段关联图书。
多对一,一对一,一对多
第一种关联关系:一对多(多对一)"一对多"是最普遍的映射关系,简单来讲就如消费者与订单的关系。
一对多:从消费者角的度来说一个消费者可以有多个订单,即为一对多。
多对一:从订单的角度来说多个订单可以对应一个消费者,即为多对一。
一对多关系在hbm文件中的配置信息:消费者(一方):<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "/hibernate-mapping-3.0.dtd"><hibernate-mapping><class name="com.suxiaolei.hibernate.pojos.Customer" table= "customer"><!-- 主键设置 --><id name="id" type="string"><column name="id"></column><generator class="uuid"></generator></id><!-- 属性设置 --><property name="username" column="username" type="string "></property><property name="balance" column="balance" type="integer"> </property><set name="orders" inverse="true" cascade="all"><key column="customer_id"></key><one-to-many class="com.suxiaolei.hibernate.pojos.Or der"/></set></class></hibernate-mapping>订单(多方):<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "/hibernate-mapping-3.0.dtd"><hibernate-mapping><class name="com.suxiaolei.hibernate.pojos.Order" table="or ders"><id name="id" type="string"><column name="id"></column><generator class="uuid"></generator></id><property name="orderNumber" column="orderNumber" type=" string"></property><property name="cost" column="cost" type="integer"></pro perty><many-to-one name="customer" class="com.suxiaolei.hibern ate.pojos.Customer"column="customer_id" cascade="save-update"> </many-to-one></class></hibernate-mapping>"一对多"关联关系,Customer方对应多个Order方,所以Customer包含一个集合用于存储多个Order,Order包含一个Customer用于储存关联自己的Customer。
1对1,1对多,多对多的逻辑关系
1对1,1对多,多对多的逻辑关系摘要:一、逻辑关系的概念1.1 对1 逻辑关系2.1 对多逻辑关系3.多对多逻辑关系二、1 对1 逻辑关系1.定义和特点2.实例分析三、1 对多逻辑关系1.定义和特点2.实例分析四、多对多逻辑关系1.定义和特点2.实例分析正文:逻辑关系是计算机科学和信息处理领域中一个重要的概念,它描述了不同实体之间的关联和互动。
在实际应用中,逻辑关系可以分为1 对1、1 对多和多对多三种类型。
一、逻辑关系的概念1.1 对1 逻辑关系:当两个实体之间存在一种一对一的关系时,我们称之为1 对1 逻辑关系。
这种关系表示一个实体对应另一个实体,且它们之间存在唯一的关联。
例如,一个学生只能选修一门课程,而一门课程只能被一个学生选修。
2.1 对多逻辑关系:当一个实体与多个实体之间存在关联时,我们称之为1 对多逻辑关系。
这种关系表示一个实体可以与多个其他实体关联,但每个其他实体只能与一个该实体关联。
例如,一个教师可以教授多门课程,而每门课程只能由一个教师教授。
3.多对多逻辑关系:当多个实体之间存在相互关联时,我们称之为多对多逻辑关系。
这种关系表示多个实体可以相互关联,且每个实体都可以与多个其他实体关联。
例如,一个学生可以选择多门课程,而每门课程可以被多个学生选择。
二、1 对1 逻辑关系1.定义和特点:1 对1 逻辑关系是指两个实体之间存在唯一的关联。
它的特点是,对于任意一个实体,只能与另一个实体形成一种关联,而且这种关联是固定的,不会发生变化。
2.实例分析:以银行的储蓄账户和客户之间的关系为例,每个客户只能拥有一个储蓄账户,而每个储蓄账户也只能对应一个客户。
这种关系就是1 对1 逻辑关系。
三、1 对多逻辑关系1.定义和特点:1 对多逻辑关系是指一个实体与多个实体之间存在关联,但每个其他实体只能与一个该实体关联。
它的特点是,对于任意一个实体,可以与多个其他实体形成关联,但每个其他实体只能与一个该实体形成关联。
数据库设计(一对一、一对多、多对多)
数据库设计(⼀对⼀、⼀对多、多对多)
关联映射:⼀对多/多对⼀
存在最普遍的映射关系,简单来讲就如球员与球队的关系;
⼀对多:从球队⾓度来说⼀个球队拥有多个球员即为⼀对多
多对⼀:从球员⾓度来说多个球员属于⼀个球队即为多对⼀数据表间⼀对多关系如下图:
关联映射:⼀对⼀
⼀对⼀关系就如球队与球队所在地址之间的关系,⼀⽀球队仅有⼀个地址,⽽⼀个地址区也仅有⼀⽀球队。
数据表间⼀对⼀关系的表现有两种,⼀种是外键关联,⼀种是主键关联。
⼀对⼀外键关联,图⽰如下:
⼀对⼀主键关联:要求两个表的主键必须完全⼀致,通过两个表的主键建⽴关联关系。
图⽰如下:
关联映射:多对多
多对多关系也很常见,例如学⽣与选修课之间的关系,⼀个学⽣可以选择多门选修课,⽽每个选修课⼜可以被多名学⽣选择。
数据库中的多对多关联关系⼀般需采⽤中间表的⽅式处理,将多对多转化为两个⼀对多。
数据表间多对多关系如下图:。
SQL的一对多,多对一,一对一,多对多什么意思?
SQL的⼀对多,多对⼀,⼀对⼀,多对多什么意思?
1、⼀对多:⽐如说⼀个班级有很多学⽣,可是这个班级只有⼀个班主任。
在这个班级中随便找⼀个⼈,就会知道他们的班主任是谁;知道了这个班主任就会知道有哪⼏个学⽣。
这⾥班主任和学⽣的关系就是⼀对多。
2、多对⼀:⽐如说⼀个班级有很多学⽣,可是这个班级只有⼀个班主任。
在这个班级中随便找⼀个⼈,就会知道他们的班主任是谁;知道了这个班主任就会知道有哪⼏个学⽣。
这⾥学⽣和班主任的关系就是多对⼀。
3、⼀对⼀:⽐如说⼀个班级有很多学⽣,他们分别有不同的学号。
⼀个学⽣对应⼀个学号,⼀个学号对应⼀个学⽣;通过学号能找到学⽣,通过学⽣也能得到学号,不会重复。
这⾥学⽣和学号的关系就是⼀对⼀。
4、多对多:⽐如说⼀个班级有很多学⽣,他们有语⽂课、数学课、英语课等很多课。
⼀门课有很多⼈上,⼀个⼈上很多门课。
这⾥学⽣和课程的关系就是多对多。
1、⼀对⼀的使⽤⽅法
(1)使⽤嵌套结果映射来处理重复的联合结果的⼦集。
(2)通过执⾏另外⼀个SQL映射语句来返回预期的复杂类型。
2、⼀对多的实现⽅法
在多的⼀⽅的表⾥⾯,添加外键。
3、多对多的实现⽅法
多对多,必须要通过单独的⼀张表来表⽰。
数据库表关系(单表、一对一、一对多、多对多)
数据库表关系(单表、⼀对⼀、⼀对多、多对多) 写在开头: ⼀直搞不清楚数据库表之间的关系,看了很多博客还是有些弥漫,没有具体的例⼦辅助。
所以写了下⾯的内容,此⽂中的案例以学校为例,个⼈理解,可能会有诸多不妥之处,仅供参考。
⼀、两个重要概念: 什么是主键?外键? 1.主键:主键是表的⼀个特殊字段,可以唯⼀地标识表中的每条信息。
⽐如:⾝份证号。
⼀个表中可以有⼀个或多个主键。
作⽤:唯⼀标识、快速查找 2.外键:如果表B的⼀个字段(外键)依赖于表A的主键。
则成表A为⽗表,表B为⼦表。
原则:外键必须依赖于数据库中已经存在的⽗表的主键,外键可以为空 作⽤:建⽴该表与⽗表的关联关系⼆、表关系 包括单表、多表(⼀对⼀、⼀对多、多对多) 1.单表 就是⼀张表,所有的数据都在⼀张表中。
例:下⾯这张表,学习信息都存在⼀张表中。
2.多表 2.1⼀对⼀(不常⽤)A 表中的⼀⾏最多只能匹配于B 表中的⼀⾏ 应⽤场景: 1.单表太⼤,⼀分为⼆ 2.由于安全原因⽽隔离表的⼀部分 例:为了收集学⽣的联系⽅式,⼜建了⼀张学⽣联系表,如下图。
联系表(⼦表)中的外键(学号),必须依赖于信息表(⽗表)中的主键(学号)存在。
2.2⼀对多A 表中的⼀⾏可以匹配B 表中的多⾏,但是 B 表中的⼀⾏只能匹配 A 表中的⼀⾏ 例:学⽣到校后,需要分班,下⾯的两张表就产⽣了。
⼀个班有多个学⽣,⼀个学⽣只能归属⼀个班级, 2.3多对多 多对多就是两个⼀对多A 表中的⼀⾏可以匹配B 表中的多⾏,反之亦然。
要创建这种关系,需要定义第三个表,称为,它的主键由 A 表和 B 表的外键组成。
例:办级分好之后学⽣就该选课了。
我们需要⼀张课程表。
⼀个学⽣可以选择多门科,⼀门课也可以多名同学上。
此时我们通过第三张表来映射这种关系。
课程表: 学⽣分班表: 选课结果(第三张表): 。
举出实体之间具有一对一,一对多,多对多的联系的例子
一对一的联系:
1. 一个人和他/她的身份证号码;
2. 一辆车和它的车牌号码;
3. 一个国家和它的首都;
4. 一个学生和他/她所在的班级;
5. 一个职工和他/她的工号;
6. 一部手机和它的手机号码;
7. 一条狗和它的主人;
8. 一本书和它的ISBN号码;
9. 一个医生和他/她的执业证号;
10. 一幢房子和它的地址。
一对多的联系:
1. 一个作者和他/她的书籍;
2. 一台服务器和它上面运行的多个应用程序;
3. 一个老师和他/她的多个学生;
4. 一种电子产品和它的多个型号;
5. 一名演员和他/她的多个影视作品;
6. 一张唱片和它内部的多首歌曲;
7. 一场比赛和参赛的多个队伍;
8. 一个知名品牌和它的多个产品系列;
9. 一名艺术家和他/她的多幅画作;
10. 一个音乐节目和它的多位演出嘉宾。
多对多的联系:
1. 多个顾客和多个商品;
2. 多个学生和多个课程;
3. 多个演员和多个电影制作公司;
4. 多个旅游者和多个旅游景点;
5. 多个歌手和多个歌曲创作者;
6. 多个商品和多个销售渠道;
7. 多家公司和多个供应商;
8. 多个人员和多个团队;
9. 多个乘客和多个航空公司;
10. 多个餐厅和多个菜品。
1对1,1对多,多对多的逻辑关系
1对1,1对多,多对多的逻辑关系
(原创实用版)
目录
1.逻辑关系的基本概念
2.1 对 1 的逻辑关系
3.1 对多的逻辑关系
4.多对多的逻辑关系
5.逻辑关系在实际应用中的重要性
正文
1.逻辑关系的基本概念
在数据库设计和数据建模领域,逻辑关系是指实体之间的联系。
逻辑关系可以分为一对一、一对多和多对多等不同类型。
这些关系有助于我们更好地理解和组织数据,从而为实际应用提供有效的数据支持。
2.1 对 1 的逻辑关系
1 对 1 的逻辑关系指的是两个实体之间存在唯一的对应关系。
例如,在学生课程表中,一个学生对应一个课程表,而一个课程表也对应一个学生。
这种关系具有确定性和唯一性,能够保证数据的完整性和准确性。
3.1 对多的逻辑关系
1 对多的逻辑关系是指一个实体可以对应多个另一个实体。
例如,在学生课程表中,一个课程可以对应多个学生。
这种关系能够反映出实体之间的层次关系,同时也为数据查询和统计提供了便利。
4.多对多的逻辑关系
多对多的逻辑关系是指两个实体之间存在多个对应关系。
例如,在作者和书籍的关系中,一个作者可以写多本书,而一本书也可以由多个作者
共同完成。
为了更好地处理这种关系,通常需要引入一个关联表来记录实体之间的对应关系。
5.逻辑关系在实际应用中的重要性
逻辑关系在实际应用中具有重要意义。
它能够帮助我们更好地组织和管理数据,保证数据的完整性和准确性。
同时,逻辑关系还能够为数据查询和统计提供便利,提高数据处理的效率。
数据库一对一、一对多、多对多关系
数据库⼀对⼀、⼀对多、多对多关系数据库⼀对⼀、⼀对多、多对多关系⼀、⾸先给出三种关系的实例⼀对⼀关系实例⼀个⼈对应⼀张⾝份证,⼀张⾝份证对应⼀个⼈⼀对多关系实例⼀个公司的部门拥有多个职员,⼀个职员只能够属于某个部门多对多实例⼀本图⽰可以拥有多个作者,⼀个作者可以写很多本书。
⼀对⼀关系⼀对多,是最常见的⼀种设计。
就是 A 表的⼀条记录,对应 B 表的多条记录,且 A 的主键作为 B 表的外键。
这主要看以哪张表为中⼼。
优点便于管理、可提⾼⼀定的查询速度减轻 CPU 的 IO 读写,提⾼存取效率。
符合数据库设计的三⼤范式。
符合关系性数据库的特性。
缺点增加⼀定的复杂程度,程序中的读写难度加⼤。
# 左表的⼀条记录唯⼀对应右表的⼀条记录,反之也⼀样# ⾝份证表create table iden(id int primary key auto_increment,name char(20) not null,iden_num char(18) not null unique);# 公民表create table civi(id int primary key auto_increment,name char(20) not null,civi_id int unique,foreign key(iden_id) references ident(iden_num) #外键的字段⼀定要保证uniqueon delete cascadeon update cascade);⼀对多关系⼀对多,是最常见的⼀种设计。
就是 A 表的⼀条记录,对应 B 表的多条记录,且 A 的主键作为 B 表的外键。
这主要看以哪张表为中⼼,我们把多对⼀和⼀对多统称为⼀对多关系,数据库中不存在多对⼀关系。
create table dep(id int primary key auto_increment,dep_name char(10),dep_comment char(60));create table emp(id int primary key auto_increment,name char(16),gender enum('male','female') not null default 'male',dep_id int,foreign key(dep_id) references dep(id)on update cascadeon delete cascade);多对多关系多对多,在数据库中也⽐较常见,可以理解为是⼀对多和多对⼀的组合。
一对多、多对一、多对多关系
⼀对多、多对⼀、多对多关系⼀对多、多对⼀在表中表达:外键在对象中的表达:集合(使⽤Set集合)在orm元数据⽂件中配置:在上述实体中添加了相应的集合(Set<LinkMan>)跟对象(Customer)属性后,就得在orm元数据中去配置这两个属性了在⼀的⼀⽅配置(即拥有集合的⼀⽅)在Customer.hbm.xml中写⼊<!--name: 填写集合属性名column: 外键名(数据库表中的外键名)class: 与我关联的类的名称,即多的⼀⽅的实体类名--><set name="linkman"><!-- 要指定的外键列名 --><key column="lkm_cust_id"></key><!-- 指定对应的关系:⼀对多 --><one-to-many class="LinkMan" /></set>在多的⼀⽅配置在LinkMan.hbm.xml中写⼊<!--name: 属性名column: 外键列名class: 与我关联的类的名称,即⼀的⼀⽅的实体类的名称--><many-to-one name="customer" column="lkm_cust_id" class="Customer"></many_to_one>⼀对多关系操作创建客户跟联系⼈,并指定客户对应的联系⼈public void test(){// 获取sessionSession session = HBUtils.CurrentSession();// 获取事务并开启Transaction tx = session.beginTransaction();// -------------------------------------// 创建客户跟联系⼈Customer customer = new Customer();customer.setCust_name("Sacrtlett");// 创建客户LinkMan linkMan = new LinkMan();linkMan.setLkm_name("Eric Jin");LinkMan linkMan1 = new LinkMan();linkMan1.setLkm_name("taylor");// 添加关系customer.getLinkMens().add(linkMan);customer.getLinkMens().add(linkMan1);linkMan.setCustomer(customer);linkMan1.setCustomer(customer);// 保存session.save(customer);session.save(linkMan);session.save(linkMan1);// -------------------------------------// 提交事务mit();}为客户添加联系⼈public void test(){// 获取sessionSession session = HBUtils.CurrentSession();// 获取事务并开启Transaction tx = session.beginTransaction();// -------------------------------------// 获取要操作的客户Customer c = session.get(Customer.class, 1L);// 创建联系⼈LinkMan linkMan = new LinkMan();linkMan.setLkm_name("mike");// 将联系⼈添加到客户,将客户设置到联系⼈中c.getLinkMens().add(linkMan);linkMan.setCustomer(c);// 保存session.save(linkMan);// -------------------------------------// 提交事务mit();}解除客户与联系⼈的关系public void test(){// 获取sessionSession session = HBUtils.CurrentSession();// 获取事务并开启Transaction tx = session.beginTransaction();// -------------------------------------// 获取要操作的客户Customer c = session.get(Customer.class, 1L);// 获取要移除的联系⼈LinkMan lm = session.get(LinkMan.class, 1L);// 将联系⼈从客户集合集合中删除c.getLinkMens().remove(lm);lm.setCustomer(null);// -------------------------------------// 提交事务mit();}多对多在表中表达上⾯的图⽚中,通过第三⽅的⼀张表将Author表跟Book表联系了起来,⽽这第三⽅表最少应该有两列,⼀列是与Author表的id关联的外键,⼀列是与Book表关联的外键。
数据库设计中一对一、多对一、多对多关系依据外键的实现条件及方法
数据库设计中⼀对⼀、多对⼀、多对多关系依据外键的实现条件及⽅法下⾯以departments和staff_info表为例(为staff_info添加指向departments的外键)⼀个表的字段作为外键的条件:列值必须⾮空且唯⼀测试例⼦如下:mysql> create table departments (dep_id int(4),dep_name varchar(11));Query OK, 0 rows affected (0.02 sec)mysql> desc departments;+----------+-------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+----------+-------------+------+-----+---------+-------+| dep_id | int(4) | YES | | NULL | || dep_name | varchar(11) | YES | | NULL | |+----------+-------------+------+-----+---------+-------+rows in set (0.00 sec)# 创建外键不成功mysql> create table staff_info (s_id int,name varchar(20),dep_id int,foreign key(dep_id) references departments(dep_id));ERROR 1215 (HY000): Cannot add foreign key# 设置dep_id⾮空,仍然不能成功创建外键mysql> alter table departments modify dep_id int(4) not null;Query OK, 0 rows affected (0.02 sec)Records: 0 Duplicates: 0 Warnings: 0mysql> desc departments;+----------+-------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+----------+-------------+------+-----+---------+-------+| dep_id | int(4) | NO | | NULL | || dep_name | varchar(11) | YES | | NULL | |+----------+-------------+------+-----+---------+-------+rows in set (0.00 sec)mysql> create table staff_info (s_id int,name varchar(20),dep_id int,foreign key(dep_id) references departments(dep_id));ERROR 1215 (HY000): Cannot add foreign key constraint# 当设置字段为unique唯⼀字段时,设置该字段为外键成功mysql> alter table departments modify dep_id int(4) unique;Query OK, 0 rows affected (0.01 sec)Records: 0 Duplicates: 0 Warnings: 0mysql> desc departments;+----------+-------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+----------+-------------+------+-----+---------+-------+| dep_id | int(4) | YES | UNI | NULL | || dep_name | varchar(11) | YES | | NULL | |+----------+-------------+------+-----+---------+-------+rows in set (0.01 sec)mysql> create table staff_info (s_id int,name varchar(20),dep_id int,foreign key(dep_id) references departments(dep_id));Query OK, 0 rows affected (0.02 sec)特别注意:需要主外结合的两个表必须是使⽤同样的⼀个引擎类型:两个表必须都是innodb存储引擎添加外键的⽅法⼀般有两种⽅法,在创建表的时候添加,或者后期再添加创建时添加mysql> create table score(-> sid int not null auto_increment primary key,-> student_id int,-> corse_id int,-> number int not null,-> constraint fk_sid foreign key (student_id) references student(sid),-> constraint fk_corse_id foreign key (corse_id) references course(cid));-----------------------------------------------------------------------------------[CONSTRAINT symbol] FOREIGN KEY [id] (从表的字段1)REFERENCES tbl_name (主表的字段2)[ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION}][ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION}CONSTRAINT symbol:可以给这个外键约束起⼀个名字,有了名字,以后找到它就很⽅便了。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
如注册时间或名称等。
4,特殊的属性:为解决某问题而设计的属性,在遇到问题后才能设计出来。
如要显示年龄,要设计一个int age吗?不是,而是应设计一个Date birthday字段,年龄是根据当前时间与生日实时计算出来的。
添加页面 addUI() addUI addUI.jsp
添加 add() toList
修改页edit() toList
${name}
${#}
如果使用了Struts2,则在JSP中写EL表达式时,req.getAttribute()查找的顺序为:
1,作用域
2,对象栈中的属性
3,Map中对应的key
5,测试
=============== 设计实体 =================
1,有几个实体?
2,之体之间有什么关系?
3,每个实体中有什么属性?
1,主键
2,关联关系属性
在类图中,关联关系是一条线,有两端,每一端应有一个表达此关联关系的属性(双向关联)。
有几个线的端指向当前类,就说明当前类中应有几个联关系属性。
表 --> 实体
3,分析功能到每个请求
可以写出Action中应该有几个方法,每个方法要做什么,返回什么页面。
4,实现功能
1,实现Action的方法,创建出用到的Service方法。
2,实现Service方法,创建出用到的Dao方法。
3,实现Dao方法。
4,写JSP页面中的代码。
1,设计实体/数据库
2,Dao
3,Service
4,Action
5,JSP
1,把HTML改为JSP
2,Action
3,...
=============== 实现一组功能的流程 ====================
1,了解全部功能。
2,设计实体(表)
实体 --> 表
<many-to-many column="" class=""></many-to-many>
</set>
3,填空
name属性:属性名(在注释中)
class属性:关联的实体类型(在注释中)
<key column="..">中写的是引用当前对象表的主键的那个外键列。
============== 映射实体 ===============
1,写注释,格式为:?属性,我与?的?关系。
例如:<!-- users属性,我与User的一对多 -->
2,拷模板
多对一:
<many-to-one name="" column="" class=""></many-to-one>
如果是多对一:当前的属性名加Id后缀。
如果是多对多:当前的类名加Id后缀。
===================== 功能分析(增删改查) ========================
增删改查4个功能,共6个请求,所以在Action中需要6个方法。
作用 方法名 返回值 页面
一对多:
<set name="">
<key column=""></key>
<one-to-many class=""/>
</set>
多对多:
<set name="" table="">
<key column=""></key>
---------------------------------------------------------------
列表 list() list list.jsp
删除 delete() toList type="redirectAction" actionName="xxAction_list"