多对多关系表
数据库一对一、一对多、多对多关系

数据库⼀对⼀、⼀对多、多对多关系数据库⼀对⼀、⼀对多、多对多关系⼀、⾸先给出三种关系的实例⼀对⼀关系实例⼀个⼈对应⼀张⾝份证,⼀张⾝份证对应⼀个⼈⼀对多关系实例⼀个公司的部门拥有多个职员,⼀个职员只能够属于某个部门多对多实例⼀本图⽰可以拥有多个作者,⼀个作者可以写很多本书。
⼀对⼀关系⼀对多,是最常见的⼀种设计。
就是 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);多对多关系多对多,在数据库中也⽐较常见,可以理解为是⼀对多和多对⼀的组合。
数据库表关系模型解析6——多对多

数据库表关系模型解析6——多对多狼奔代码生成器是一款为程序员设计的前期开发辅助工具,是一个软件项目智能开发的平台,它可以自动生成页面及后台代码。
实践开发过程中,我们使用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技术。
数据库实体间一对多(多对一)、多对多关系处理

数据库实体间⼀对多(多对⼀)、多对多关系处理
数据库实体间有三种对应关系:⼀对⼀,⼀对多,多对多。
⼀对⼀关系⽰例:⼀个学⽣对应⼀个学⽣档案材料,或者每个⼈都有唯⼀的⾝份证编号。
⼀对多关系⽰例:⼀个学⽣只属于⼀个班,但是⼀个学院有多名学⽣。
多对多关系⽰例:⼀个学⽣可以选择多门课,⼀门课也有多名学⽣。
这三种关系在数据库中逻辑结构处理分析:
1.⼀对多关系处理:
我们以学⽣和班级之间的关系来说明⼀对多的关系处理⽅法。
假设现有基本表学⽣表(学号,姓名,……),班级表(班级号,备注信息,……)。
⽅法⼀:
新增⼀个关系表,⽤来表⽰学⽣与班级的属于关系,该关系表包含字段(学⽣号,班级号)。
通过学⽣号与班级号的对应关系表⽰学⽣属于的班级。
⽅法⼆:
在学⽣表中新增字段(班级号),该字段作为学⽣表的外键与班级表中的班级号关联。
每⼀个学⽣实体在班级号字段的值,表⽰该学⽣属于的班级。
⼩结:⼀般情况下,⼀对多关系采⽤⽅法⼆来处理。
⼀对多的两个实体间,在“多”的实体表中新增⼀个字段,该字段是“⼀”实体表的主键。
2.多对多关系处理:
在多对多关系中,我们要新增加⼀个关系表。
如在上⾯⽰例中,在学⽣表和课程表的基础上增加选课表来表⽰学⽣与课程之间的多对多关系。
在选课表中,必须含有的属性有学⽣号和课程号。
(学⽣号,课程号)这个属性集刚好也就是选课表的关键字。
1对1,1对多,多对多的逻辑关系

1对1,1对多,多对多的逻辑关系
摘要:
一、引言
1.逻辑关系的概念
2.逻辑关系的分类
二、1 对1 的逻辑关系
1.定义与特点
2.实例分析
三、1 对多的逻辑关系
1.定义与特点
2.实例分析
四、多对多的逻辑关系
1.定义与特点
2.实例分析
五、总结
1.逻辑关系在实际应用中的意义
2.逻辑关系对思维方式的影响
正文:
逻辑关系是我们在思考和分析问题时,对事物之间联系的一种表达方式。
在众多逻辑关系中,1 对1、1 对多和多对多是最基本的三种关系。
首先,我们来了解一下1 对1 的逻辑关系。
这是一种单一的、明确的关
系,例如:学生与课程之间就是1 对1 的关系,一个学生可以选择多门课程,但一门课程只能被一个学生选择。
其次,1 对多的逻辑关系是指一个对象可以与多个其他对象发生关系,例如:教师与课程之间的关系。
一个教师可以教授多门课程,而一门课程可以由多个教师来教授。
最后,多对多的逻辑关系是指多个对象之间可以相互关联,例如:学生选课关系。
一个学生可以选择多门课程,同样,一门课程也可以被多个学生选择。
这种关系较为复杂,需要通过建立中间表来解决数据冗余和查询困难的问题。
总之,1 对1、1 对多和多对多的逻辑关系在我们日常生活和工作中无处不在,它们有助于我们更好地理解事物之间的关系,从而进行有效沟通和高效工作。
图文详解laravel多对多关联模型

图⽂详解laravel多对多关联模型关联模型(多对多)多对多关系(抽象)例:⼀篇⽂章可能有多个关键词,⼀个关键词可能被多个⽂章使⽤。
关键词表:字段id主键字段keyword关键词⽂章与关键词的关系表:字段id主键----字段article_id⽂章id字段key_id关键词id创建迁移⽂件:php artisan make:migration create_keyword_tablephp artisan make:migration create_relation_table编写迁移⽂件的代码:执⾏迁移php artisan migrate创建填充器:php artisan make:seeder KeywordAndRelationTableSeeder编写填充器数据:字段id 主键<?phpnamespace Database\Seeders;use Illuminate\Database\Seeder;use DB;class KeywordAndRelationTableSeeder extends Seeder{/*** Run the database seeds.** @return void*/public function run(){//关键词数据DB::table('keyword') -> insert([['keyword' => '搞笑'],['keyword' => '⽂艺'],['keyword' => '正⽚'],['keyword' => '惊悚'],['keyword' => '娱乐'],['keyword' => '武术'],]);//关系表DB::table('relation') -> insert([['article_id' => rand(1,3),'keyword_id' => rand(1,6)],['article_id' => rand(1,3),'keyword_id' => rand(1,6)],['article_id' => rand(1,3),'keyword_id' => rand(1,6)],['article_id' => rand(1,3),'keyword_id' => rand(1,6)],]);}}执⾏填充器:php artisan db:seed --class=KeywordAndRelationTableSeeder案例:查询出每个⽂章(主)下全部的关键词(从)语法:return $this -> belongsToMany(被关联模型的元素空间路径, 多对多模型的关系表名, 关系表中当前模型中的关系键,关系表中被关联模型的关系键)上述语法提及到的关系键是指在关系表中的字段名。
数据库-一对一、一对多、多对一、多对多关系

数据库-⼀对⼀、⼀对多、多对⼀、多对多关系
⼀对多关系、多对⼀关系和⼀对⼀关系
1. ⾄少都有⼀侧是单个实体,所以记录之间的联系通过外键实现,让外键指向这个实体。
2. 实现这种关系时,要在“多”这⼀侧加⼊⼀个外键,指向“⼀”这⼀侧联接的记录。
多对多关系
1. 解决⽅法是添加第三个表,这个表称为关联表。
2. 多对多关系可以分解成原表和关联表之间的两个⼀对多关系
多对多关系例⼦
查询多对多关系要分成两步。
1. 若想知道某位学⽣选择了哪些课程,要先从学⽣和注册之间的⼀对多关系开始,获取这位学⽣在 registrations 表中的所有记录。
2. 然后再按照多到⼀的⽅向遍历课程和注册之间的⼀对多关系,找到这位学⽣在 registrations 表中各记录所对应的课程。
3. 同样,若想找到选择了某门课程的所有学⽣,你要先从课程表中开始,获取其在 registrations 表中的记录,再获取这些记录联接的学⽣。
⾃引⽤关系也是多对多的⼀种特殊情况
如果关系中的两侧都在同⼀个表中,这种关系称为⾃引⽤关系。
在关注中,关系的左侧是⽤户实体,可以称为“关注者”;关系的右侧也是⽤户实体,但这些是“被关注者”。
多对多关系表

数据库建表-- 一对多/多对一/一对一/多对多关系关联映射:一对多/多对一存在最普遍的映射关系,简单来讲就如球员与球队的关系;一对多:从球队角度来说一个球队拥有多个球员即为一对多多对一:从球员角度来说多个球员属于一个球队即为多对一数据表间一对多关系如下图:关联映射:一对一关系就如球队与球队所在地址之间的关系,一支球队仅有一个地址,而一个地址区也仅有一支球队。
数据表间一对一关系的表现有两种,一种是外键关联,一种是主键关联。
图示如下:一对一外键关联:一对一主键关联:要求两个表的主键必须完全一致,通过两个表的主键建立关联关系关联映射:多对多多对多关系也很常见,例如学生与选修课之间的关系,一个学生可以选择多门选修课,而每个选修课又可以被多名学生选择。
数据库中的多对多关联关系一般需采用中间表的方式处理,将多对多转化为两个一对多。
数据表间多对多关系如下图:----------------------------------------------------------------------------------------------------------前言:多对多关系至少需要3个表,我们把一个表叫做主表,一个叫做关系表,另外一个叫做字典表或者副表(字典表是纪录比较少,而且基本稳定的,例如:版块名称;副表是内容比较多,内容变化的,例如)。
按照数据库的增删查改操作,多对多关系的查找都可以用inner join或者select * from 主表where id in (select 主表id from 关系表)1,角色任命型特点:关系表两外键组合无重复纪录,关系表一般不需要时间字段和主键,有一个表是字典类型的表。
界面特点:显示主表,用checkbox或多选select设置多选关系。
例如:任命版主(用户表-关系表-版块名称表),角色权限控制等,用户是5个版块版主,只要关系表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、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据库建表-- 一对多/多对一/一对一/多对多关系
关联映射:一对多/多对一存在最普遍的映射关系,简单来讲就如球员与球队的关系;一对多:从球队角度来说一个球队拥有多个球员即为一对多多对一:从球员角度来说多个球员属于一个球队即为多对一数据表间一对多关系如下图:
关联映射:一对一关系就如球队与球队所在地址之间的关系,一支球队仅有一个地址,而一个地址区也仅有一支球队。
数据表间一对一关系的表现有两种,一种是外键关联,一种是主键关联。
图示如下:
一对一外键关联:
一对一主键关联:要求两个表的主键必须完全一致,通过两个表的主键建立关联关系
关联映射:多对多
多对多关系也很常见,例如学生与选修课之间的关系,一个学生可以选择多门选修课,而每个选修课又可以被多名学生选择。
数据库中的多对多关联关系一般需采用中间表的方式处理,将多对多转化为两个一对多。
数据表间多对多关系如下图:
----------------------------------------------------------------------------------------------------------
前言:多对多关系至少需要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来存储,因为这类型的值一般不会用来计算)。
比如:
军队的数据库设计中有种物资叫做“战缴物资”,就是打仗的时候缴获的,军队自己都不知道这些物资有什么属性。
比如缴获的化学品有化学名,通用名,是否有辐射,计量单位,包装规格,数量等等,或者不是化学品是其他任何未知的东西。
这样东西就可以
某奇怪东西.属性集合["某某奇怪属性名"]="某某奇怪值";
某变态东西.属性集合["某某变态属性名"]="某某变态值";
这样存储。
再比如:
手机型号有几千种,除了共同属性外还有不同属性有几百个,属性名和值类型都不一样,有的手机有这属性,有的没有。
对于这样的“多态”,我们就采用上面的设计结构。
其效果相当于:
某奇怪手机.属性集合["某某奇怪属性名"]="某某奇怪值";
某变态手机.属性集合["某某变态属性名"]="某某变态值";
界面特点:设置主表一行纪录的属性时候,要列出所有可能的属性名称,每个对应一个文本框。