精华内容
参与话题
问答
  • 数据库:一对一,一对多,多对多

    千次阅读 2018-08-16 10:08:11
    一对一:就是说A表中的一条记录对应着B表的一条记录。大家可能会觉得这不是变得复杂了吗?其实不然,如果,当一张表的字段过于太多,而很多字段可能只有在某些情况下,才会使用到,这时也可以考虑使用一对一设计。 ...

    一对一:就是说A表中的一条记录对应着B表的一条记录。大家可能会觉得这不是变得复杂了吗?其实不然,如果,当一张表的字段过于太多,而很多字段可能只有在某些情况下,才会使用到,这时也可以考虑使用一对一设计。

    条件:建立单独的表就行了,

    优点

    1.   便于管理、可提高一定的查询速度

    2.   减轻 CPU 的 IO 读写,提高存取效率。

    3.   符合数据库设计的三大范式。

    4.   符合关系性数据库的特性。

      缺点

    1.   增加一定的复杂程度,程序中的读写难度加大

     

     一对多:顾名思义,A表一条数据对应B表多条数据。需要将A表主键作为B表的外键。

    sql语句 :A :primary key (‘id’);(指定主键)

                    B:FOREIGN KEY('B-id') REFERENCES  'A' ('id'); (将外键B-id和主键id关联)

    多对多: 需要一张中间表来对应他们的关系。那么此时,A,B表并不需要其他的外键。只需各有自己的主键就行,就像一张单独的表一样。

    因为需要一张单独的关系表来映射他们的关系。 

    就比如这个:将orderid和productid作为联合主键。然后相互对应各自的外键。

    有人可能就疑惑了,怎么这里设置了两个主键?

    有必要讲下联合主键和复合主键了。

    一、复合主键

     

      所谓的复合主键 就是指你表的主键含有一个以上的字段组成,不使用无业务含义的自增id作为主键。

    比如 

     

    
     
    1. create table test

    2. (

    3. name varchar(19),

    4. id number,

    5. value varchar(10),

    6. primary key (name,id)

    7. )


    上面的name和id字段组合起来就是你test表的复合主键 ,它的出现是因为你的name字段可能会出现重名,所以要加上ID字段这样就可以保证你记录的唯一性 ,一般情况下,主键的字段长度和字段数目要越少越好 。

     

     

    这里就会有一个疑惑?  主键是唯一的索引,那么为何一个表可以创建多个主键呢?

     

    其实“主键是唯一的索引”这话有点歧义的。举个例子,我们在表中创建了一个ID字段,自动增长,并设为主键,这个是没有问题的,因为“主键是唯一的索引”,ID自动增长保证了唯一性,所以可以。


    此时,我们再创建一个字段name,类型为varchar,也设置为主键,你会发现,在表的多行中你是可以填写相同的name值的,这岂不是有违“主键是唯一的索引”这句话么?


    所以我才说“主键是唯一的索引”是有歧义的。应该是“当表中只有一个主键时,它是唯一的索引;当表中有多个主键时,称为复合主键,复合主键联合保证唯一索引”。


    为什么自增长ID已经可以作为唯一标识的主键,为啥还需要复合主键呢。因为,并不是所有的表都要有ID这个字段,比如,我们建一个学生表,没有唯一能标识学生的ID,怎么办呢,学生的名字、年龄、班级都可能重复,无法使用单个字段来唯一标识,这时,我们可以将多个字段设置为主键,形成复合主键,这多个字段联合标识唯一性,其中,某几个主键字段值出现重复是没有问题的,只要不是有多条记录的所有主键值完全一样,就不算重复。

     

    二、联合主键

     

               联合主键顾名思义就是多个主键联合形成一个主键组合(主键原则上是唯一的,别被唯一值所困扰。)  

               联合主键的意义:用2个字段(或者多个字段,后面具体都是用2个字段组合)来确定一条记录,说明,这2个字段都不是唯一的,2个字段可以分别重复,这么设置的好处,可以很直观的看到某个重复字段的记录条数。

     

    一个简单的例子 


    主键A跟主键B组成联合主键 


    主键A跟主键B的数据可以完全相同,联合就在于主键A跟主键B形成的联合主键是唯一的。 
    下例主键A数据是1,主键B数据也是1,联合主键其实是11,这个11是唯一值,绝对不充许再出现11这个唯一值。(这就是多对多关系) 

     

    复合主键是一个表中 用两个字段来确定数据唯一性

    (这个是表中任意字段)

    联合主键则是用两个或多个表中的主键组合起来确定数据唯一性

    (这个是两个表的主键)

    多对多中就是可以用联合主键。(因为两个键可以保证不重复)

     

     

    展开全文
  • 数据库一对一、一对多、多对多关系

    万次阅读 多人点赞 2018-01-10 15:54:10
    数据库一对一、一对多、多对多关系  本来数据库一对一、一对多、多对多关系并不复杂,但是最近在理解的时候感觉又感觉多了写新意,所以现在在来总结一下吧 一、首先给出三种关系的实例 1、一对一关系实例 ...
    数据库一对一、一对多、多对多关系

         本来数据库一对一、一对多、多对多关系并不复杂,但是最近在理解的时候感觉又感觉多了写新意,所以现在在来总结一下吧
    一、首先给出三种关系的实例
    1、一对一关系实例
       * 一个人对应一张身份证,一张身份证对应一个人
    2、一对多关系实例
       * 一个班级拥有多个学生,一个学生只能够属于某个班级
    3、多对多实例
       * 一个学生可以选修多门课程,一个课程可以被多个学生选修

    二、一对一关系

    一对一关系是最好理解的一种关系,在数据库建表的时候可以将人表的主键放置与身份证表里面,也可以将身份证表的主键放置于人表里面

    三、一对多关系


    • 班级是1端,学生是多端,结合面向对象的思想,1端是父亲,多端是儿子,所以多端具有1端的属性,也就是说多端里面应该放置1端的主键,那么学生表里面应该放置班级表里面的主键

    四、多对多关系

    对于多对多关系,需要转换成1对多关系,那么就需要一张中间表来转换,这张中间表里面需要存放学生表里面的主键和课程表里面的主键,此时学生与中间表示1对多关系,课程与中间表是1对多关系,学生与课程是多对多关系

    四、总结

    总而言之,最重要的关系就是1对多关系,根据面向对象思想在建表的时候将1端主键置于多端即可。


    展开全文
  • 第一个表示图书和英雄的一对多关系: class BookInfo(models.Model):  # 图书名称  name = models.CharField(max_length=100)  # 图书出版社名字  publish_name = models.CharField(max_length=50)  # 图书出版...

    第一个表示图书和英雄的一对多关系:
    class BookInfo(models.Model):
        # 图书名称
        name = models.CharField(max_length=100)
        # 图书出版社名字
        publish_name = models.CharField(max_length=50)
        # 图书出版时间
        publish_date = models.DateField()
        # 图书阅读量
        read_num =  models.IntegerField(default=0)
        #图书评论量
        comment_num  = models.IntegerField(default=0)
        # 是否删除
        is_delete = models.CharField(max_length=1)

        class Meta:
            db_table = 'book_info'

    # 创建英雄类
    class HeroInfo(models.Model):
        # 英雄姓名
        name = models.CharField(max_length=50)
        # 英雄性别 False表示男 True表示女
        gendery = models.BooleanField(default=False)
        # 英雄技能
        comment = models.CharField(max_length=128)
        # 和书的关系表示 一对多关系的表示
        hbook = models.ForeignKey('BookInfo')

        # 我们想我们的表名并不依赖于项目名 要通过元选项解决 加入一个Meta 通过db_table 重新设置表名
        class Meta:
            db_table = 'hero_info'

     


    # 用老师和学生来模拟一个多对多
    class teacher(models.Model):
        # 老师姓名
        teacher_name = models.CharField(max_length=20)
        # 老师工作内容
        teacher_content = models.CharField(max_length=200)
        # 老师年龄
        teacher_age =  models.IntegerField(default=20)
        # 教龄
        teacher_work_age = models.IntegerField(null=True,default=0)
        # 表示多对多(这个写在任意一方都可以)
        student_relation =models.ManyToManyField('student')

    class student(models.Model):
        # 学生姓名
        student_name = models.CharField(max_length=20)
        # 学生年龄
        student_age = models.IntegerField(default=10)
        # 学生成绩
        student_score = models.IntegerField(null=True)
        # 学生班级
        student_class = models.CharField(max_length=10,null=True)

     

     

    # 用用户和用户详细信息模拟一对一关系
    class user(models.Model):
        # 用户姓名
        name = models.CharField(max_length=20)
        # 用户名
        user = models.CharField(max_length=50)
        # 密码
        password =  models.CharField(max_length=50)
        # 年龄
        age = models.IntegerField()

        # 表示一对一(这个写在任意一方都可以)
        user_detail = models.OneToOneField('userDetail')

    class userDetail(models.Model):
        # 用户电话
        phone = models.CharField(max_length=20)
        # 用户家庭地址
        address = models.CharField(max_length=100)
        # 用户教育背景
        education = models.CharField(max_length=500)

    是不是很简单呢。如果想学习python的话,https://item.taobao.com/item.htm?spm=a1z38n.10677092.0.0.4ebc1debC9k2t4&id=580652007680,你可以的兄弟。

    展开全文
  • 表关系(一对一,一对多,多对多)

    千次阅读 2018-03-03 21:04:31
    可以在数据库图表中的表之间创建关系,以显示个表中的列与另个表中的列是如何相链接的。在个关系型数据库中,利用关系可以避免多余的数据。例如,如果设计个可以跟踪图书信息的数据库,您需要创建个名为 ...

    可以在数据库图表中的表之间创建关系,以显示一个表中的列与另一个表中的列是如何相链接的。

    在一个关系型数据库中,利用关系可以避免多余的数据。例如,如果设计一个可以跟踪图书信息的数据库,您需要创建一个名为 titles 的表,它用来存储有关每本书的信息,例如书名、出版日期和出版社。您也可能保存有关出版社的信息,诸如出版社的电话、地址和邮政编码。如果您打算在 titles 表中保存所有这些信息,那么对于某出版社出版的每本书都会重复该出版社的电话号码。

    更好的方法是将有关出版社的信息在单独的表,publishers,中只保存一次。然后可以在 titles 表中放置一个引用出版社表中某项的指针。

    为了确保您的数据同步,可以实施 titles 和 publishers 之间的参照完整性。参照完整性关系可以帮助确保一个表中的信息与另一个表中的信息相匹配。例如,titles 表中的每个书名必须与 publishers 表中的一个特定出版社相关。如果在数据库中没有一个出版社的信息,那么该出版社的书名也不能添加到这个数据库中。

    为了更好地理解表关系,请参阅:

    定义表关系

    关系的确立需要通过匹配列中的数据(通常是两表中同名的列)。在大多数情况下,该关系会将一个表中的主键(它为每提供了唯一标识)与另一个表的外部键中的某项相匹配。例如,通过创建 titles 表中的 title_id(主键)与 sales 表中的 title_id 列(外部键)之间的关系,则销售额就与售出的特定书名相关联了。

    表之间有三种关系。所创建关系的类型取决于相关是如何定义的。

    一对多关系

    一对多关系是最普通的一种关系。在这种关系中,A 表中的一行可以匹配 B 表中的多行,但是 B 表中的一行只能匹配 A 表中的一行。例如,publishers 和 titles 表之间具有一对多关系:每个出版社出版很多书,但是每本书名只能出自一个出版社。

    只有当一个相关列是一个主键或具有唯一约束时,才能创建一对多关系。

    多对多关系

    多对多关系中,A 表中的一行可以匹配 B 表中的多行,反之亦然。要创建这种关系,需要定义第三个表,称为结合表,它的主键由 A 表和 B 表的外部键组成。例如,authors 和 titles 表具有多对多关系,这是由于这些表都与 titleauthors 表具有一对多关系。titleauthors 表的主键是 au_id 列(authors 表的主键)和 title_id 列(titles 表的主键)的组合。

    一对一关系

    一对一关系中,A 表中的一行最多只能匹配于 B 表中的一行,反之亦然。如果相关列都是主键或都具有唯一约束,则可以创建一对一关系。

    这种关系并不常见,因为一般来说,按照这种方式相关的信息都在一个表中。可以利用一对一关系来:

    • 分割具有多列的表。

    • 由于安全原因而隔离表的一部分。

    • 保存临时的数据,并且可以毫不费力地通过删除该表而删除这些数据。

    • 保存只适用于主表的子集的信息。

    实施参照完整性

    参照完整性是一个规则系统,能确保相关表行之间关系的有效性,并且确保不会在无意之中删除或更改相关数据。

    当实施参照完整性时,必须遵守以下规则:

    • 如果在相关表的主键中没有某个值,则不能在相关表的外部键列中输入该值。但是,可以在外部键列中输入一个 null 值。例如,不能将一项工作分配给一位没有包含在 employee 表中的雇员,但是可以在 employee 表的 job_id 列中输入一个 null 值,表明一位雇员没有分配工作。

    • 如果某行在相关表中存在相匹配的行,则不能从一个主键表中删除该行。例如,如果在 employee 表中表明某些雇员分配了某项工作,则不能在 jobs 表中删除该工作所对应的行。

    • 如果主键表的行具有相关行,则不能更改主键表中的某个键的值。例如,如果一位雇员分配了 jobs 表中的某项工作,则不能从 employee 表中删除该雇员。

    当符合下列所有条件时,才可以设置参照完整性:

    • 主表中的匹配列是一个主键或者具有唯一约束

    • 相关列具有相同的数据类型和大小。

    • 两个表属于相同的数据库。
     
    展开全文
  • 一张订单对应一个用户,这是一对一 然后,站在用户的角度考虑: 一个用户可以有多个订单,这是一对多 那么SQL语句该如何写? 还记得外联接吗,left/right join 以某张表为主,取出里面所有记录,然后每条...
  • 关联映射:一对一 一对一关系就如球队与球队所在地址之间的关系,一支球队仅有一个地址,而一个地址区也仅有一支球队。 数据表间一对一关系的表现有两种,一种是外键关联,一种是主键关联。 一对一外键关联,图示...
  • 一对一直播平台指的就是盈利性双人一对一视频直播聊天交友系统,是私密性极强的互动系统,而一对一直播源码则是能够快速实现这种一对一视频直播聊天交友平台搭建的系统程序。 直播市场依旧火爆,其衍生出的“直播+...
  • 公民和公民的身份证,是一个一对一的例子,一个公民只有一个身份证。 这个是基于主键的,基于外键的映射在:http://blog.csdn.net/nthack5730/article/details/45336457 场景准备: 实体类:Person.java、...
  • Flask04-模型的一对一,一对多,多对多

    万次阅读 2018-06-23 23:22:29
    1. 一对一关系主要通过一个 uselist=False 来约束, 因为在一对多中通过 查询得到的是一个列表, 所以, uselist=False禁用列表, 使我们只能查找到一个, 就构成了一对一关系人和身份证的一对一一关系 ​ from flask_...
  • hibernate一对一唯一外键关联

    千次阅读 2010-04-29 10:19:00
    一: hibernate的一对一唯一外键关联(单向),类图: 一对一的外键关联可以采用,指定多的一端unique=true,保证多的一方唯一性,Person.hbm.xml: 其中表示对Person与User一对一外键的关系配置。可以看
  • 一对多:从球队角度来说一个球队拥有多个球员 即为一对多多对一:从球员角度来说多个球员属于一个球队 即为多对一数据表间一对多关系如下图: 关联映射:一对一关系就如球队与球队所在地址之间的关系,一支球队仅有...
  • 关联映射:一对多/多对一 存在最普遍的映射关系,简单来讲就如球员与球队的关系; 一对多:从球队角度来说一个球队拥有多个球员 即为一对多 ...数据表间一对一关系的表现有两种,一种是外键关联
  • application.properties配置文件############################################ ## MySQL数据库连接 ############################################ spring.datasource.url = jdbc:mysql://localhost:3306/db?...
  • 一对一关联映射:  两个对象之间是一对一的关系,例如人和身份证号码之间的关系。 单向一对一关联映射:  即在一个对象中存在另一个对象的引用,而在另一个对象中则不存在该对象的引用。 以人和身份证号码之间...
  • Mybatis一对一关联查询

    万次阅读 2016-09-18 10:30:23
    Mybatis一对一关联查询有两张表,teacher和class,一个class班级对应一个teacher,一个teacher对应一个class需求是根据班级id 查询班级信息(带老师的信息)创建teacher和class表:CREATE TABLE teacher ( t_id INT ...
  • Hibernate关联关系配置(一对多、一对一和多对多)

    万次阅读 多人点赞 2012-03-05 19:38:51
    第一种关联关系:一对多(多对一) "一对多"是最普遍的映射关系,简单来讲就如消费者与订单的关系。 一对多:从消费者角的度来说一个消费者可以有多个订单,即为一对多。 多对一:从订单的角度来说多个订单...
  • 实例背景:公民和公民的身份证,是一个一对一的例子,一个公民只有一个身份证。以这个背景开展说明!
  • yii2 一对多:hasMany 一对一:hasOne

    万次阅读 2015-11-25 09:53:37
    一对多:hasMany一对一:hasOne 返回结果:这两个方法的返回结果都为yii\db\ActiveQuery对象第一个参数:所关联的模型的类名称。第二个参数:是一个数组,其中键为所关联的模型中的属性,值为当前模型中的属性。
  • Mybatis 一对一,一对多查询

    万次阅读 2020-01-13 19:09:59
    1.为类配置别名 <!-- 类型别名,xml不需要写入全包名类名 --> <typeAliases> <typeAlias type="com.jym.bean.User" alias="User"/> </typeAliases>...实体类:省略...
  • Hibernate详解(3)——一对一映射分析

    千次阅读 多人点赞 2012-05-19 21:18:44
    一对一关系也是比较常见的一种关系,在Hibernate中可以分为单向一对一关系和双向一对一关系。分类的原因一般是由于需求决定的,单双向是站在不同的角度去看认为规定的。一对一关系相对来说比较少见。但是在某些时候...

空空如也

1 2 3 4 5 ... 20
收藏数 11,229,772
精华内容 4,491,909
关键字:

一对一