精华内容
下载资源
问答
  • 在看某个项目的数据库的时候发现比较多,且都是和用户相关的,又涉及到租户、站点等,表关系有点小复杂,而且都是虚拟外键,于是自己来创建模型来方便缕清之间关系。 使用的工具为NavicatPremium15 ,12应该也差...

    “模型” 是一个用于创建和操作数据库模型的强大工具。在主窗口中,点击 “模型” 来打开模型的对象列表。
    【注意】 仅适用于 MySQL、 Oracle、 PostgreSQL、 SQLite、 SQL Server 和 MariaDB。
    一些主要的功能如下:
     创建和操作概念、逻辑或物理模型。
    【注意】 仅 Navicat Premium 支持概念模型和逻辑模型。
     逆向工程,将一个数据库/模式、表或视图转为物理模型。
     正向工程,将一个物理模型转为 SQL 文件或数据库/模式。
     直接创建和编辑表结构。

    在看某个项目的数据库的时候发现表比较多,且都是和用户相关的,又涉及到租户、站点等,表关系有点小复杂,而且都是虚拟外键,于是自己来创建模型来方便缕清表之间关系。
    使用的工具为NavicatPremium15 ,12应该也差不了太多

    1. 新建
      在这里插入图片描述
      在这里插入图片描述
    2. 然后选择你要导入的库 表就完事了
      在这里插入图片描述
    3. 然后就会看到一大堆表 这时可以选择一个切入点,比如我这里选择了 admin 用户详情表,该表能关联到租户、角色、登陆信息等,把光标放到字段或表上,如果该字段或表加了注释就能弹出注释(这个功能十分方便,这里也吐槽下没加注释的表),再加上该字段和表的命名,如果够规范就能快速找到其关联表,有的是使用关联表,用以关联两张表的关系,我这里的关联表表名都是以"_relation"结尾,能够快速识别
      在这里插入图片描述
      确定好外键关系之后点击外键,然后拖动表中的字段,到你要关联的另外一个表上的字段上,这时候就会建立连线
      在这里插入图片描述

    光标放到线上还会高亮被关联的两个字段,下面图中关联表可以设置成其它颜色,以示区分
    在这里插入图片描述

    在这里插入图片描述
    这时表越来越多可能会非常乱,可以点击自动布局进行整理,有了这个功能自己其实只要把线给连上就完事了
    在这里插入图片描述
    而在模型区的右侧还有其它功能可使用,比如加入图像,层,形状等
    在这里插入图片描述
    比如这里我使用层来进行分块,如下面这个层放的都是我暂时搞不懂的表
    在这里插入图片描述
    整体效果图如下,个人感觉非常直观,这里就不便放清晰的图了
    在这里插入图片描述
    这里是为了理清表关系导入的已经建好的表, 当然这里的模型建好后反过来还能导出为sql, 或许这才是正确用途,总之本人感觉这个功能很不错,值得把玩

    展开全文
  • 一个模型类在数据库中对应一张,在模型类中定义的属性,对应该模型对照中的一个字段

    一个模型类在数据库中对应一张表,在模型类中定义的属性,对应该模型对照表中的一个字段

    展开全文
  • Django 对各种数据库提供了很好的支持,...对象关系映射(Object Relational Mapping,简称 ORM )用于实现面向对象编程语言里不同类型系统的数据之间的转换。 ORM 在业务逻辑层和数据库层之间充当了桥梁的作用。 ORM

    Django 对各种数据库提供了很好的支持,包括:PostgreSQL、MySQL、SQLite、Oracle。

    Django 为这些数据库提供了统一的调用API。 我们可以根据自己业务需求选择不同的数据库。

    MySQL 是 Web 应用中最常用的数据库。

    Django 模型使用自带的 ORM。

    对象关系映射(Object Relational Mapping,简称 ORM )用于实现面向对象编程语言里不同类型系统的数据之间的转换。

    ORM 在业务逻辑层和数据库层之间充当了桥梁的作用。

    ORM 是通过使用描述对象和数据库之间的映射的元数据,将程序中的对象自动持久化到数据库中。

    作用:根据对象的类型生成表结构,将对象、列表的操作转换为sql语句,将sql语句查询到的结果转换为对象、列表,极大的减轻了开发人员的工作量,不需要面对因数据库的变更而修改代码。

    ORM 解析过程:

    • 1、ORM 会将 Python 代码转成为 SQL 语句。
    • 2、SQL 语句通过 pymysql 传送到数据库服务端。
    • 3、在数据库中执行 SQL 语句并将结果返回。

    ORM 对应关系表:


    定义模型:参考https://www.runoob.com/django/django-model.html


    由于django的查询方式,不允许使用连续的下划线。

    定义属性时,需要字段类型,字段类型被定义在```django.db.models.fields```目录下,为了方便使用,被导入到```django.db.models```中,定义模型时先导入```from django.db import models```,通过models.Field创建字段类型的对象,赋值给属性。

    注意:对于重要数据都做逻辑删除,不做物理删除,实现方法是定义isDelete属性,类型为BooleanField,默认值为False


    模型间关系:一对一关系 : OneToOneField、一对多关系 : ForeignKey、

    多对多关系 : ManyToManyField

    关联管理器(对象调用):

    前提:

    • 多对多(双向均有关联管理器)
    • 一对多(只有多的那个类的对象有关联管理器,即反向才有)

    语法格式:

    正向:属性名

    反向:小写表名_set

    一对多关系 : ForeignKey

    class Student(models.Model):

              name = models.CharField()

              grade = ForeignKey(Grade)

    class Grade(models.Model):

              gname = models.CharField()

     

    stu = Student()

    grade = Grade() 

    stu.grade # 正向查询,通过学生查询班级名

    grade.student_set # 反向查询,通过班级名查询学生

    多对多关系 : ManyToManyField

    class Student(models.Model):

              name = models.CharField()

              course = ManyToManyField(Course)

    class Curse(models.Model):

              cname = models.CharField()

     

    stu = Student()

    course = Course() 

    stu.course_set # 正向 查询学生选修的课程

    course.student_set # 反向 查询选修课程的学生名

    表与表之间的关系可分为以下三种:

    • 一对一: 一个人对应一个身份证号码,数据字段设置 unique
    • 一对多: 一个家庭有多个人,一般通过外键来实现。
    • 多对多: 一个学生有多门课程,一个课程有很多学生,一般通过第三个表来实现关联。

    创建模型:

    接下来我们来看下多表多实例:

    class Book(models.Model):
        title = models.CharField(max_length=32)
        price = models.DecimalField(max_digits=5, decimal_places=2)
        pub_date = models.DateField()
        publish = models.ForeignKey("Publish", on_delete=models.CASCADE)
        authors = models.ManyToManyField("Author")


    class Publish(models.Model):
        name = models.CharField(max_length=32)
        city = models.CharField(max_length=64)
        email = models.EmailField()


    class Author(models.Model):
        name = models.CharField(max_length=32)
        age = models.SmallIntegerField()
        au_detail = models.OneToOneField("AuthorDetail", on_delete=models.CASCADE)


    class AuthorDetail(models.Model):
        gender_choices = (
            (0, "女"),
            (1, "男"),
            (2, "保密"),
        )
        gender = models.SmallIntegerField(choices=gender_choices)
        tel = models.CharField(max_length=32)
        addr = models.CharField(max_length=64)
        birthday = models.DateField()

    说明:

    1、EmailField 数据类型是邮箱格式,底层继承 CharField,进行了封装,相当于 MySQL 中的 varchar。

    2、Django1.1 版本不需要联级删除:on_delete=models.CASCADE,Django2.2 需要。

    3、一般不需要设置联级更新.

    4、外键在一对多的多中设置:models.ForeignKey("关联类名", on_delete=models.CASCADE)。

    5、OneToOneField = ForeignKey(...,unique=True)设置一对一。

    6、若有模型类存在外键,创建数据时,要先创建外键关联的模型类的数据,不然创建包含外键的模型类的数据时,外键的关联模型类的数据会找不到。

    表结构:

    书籍表 Book:title 、 price 、 pub_date 、 publish(外键,多对一) authors(多对多)

    出版社表 Publish:name 、 city 、 email

    作者表 Author:name 、 age 、 au_detail(一对一)

    作者详情表 AuthorDetail:gender 、 tel 、 addr 、 birthday

    以下是表格关联说明:


    插入数据:

    在 MySQL 中执行以下 SQL 插入操作:

    insert into app01_publish(name,city,email) values ("华山出版社", "华山", "hs@163.com"), ("明教出版社", "黑木崖", "mj@163.com")

    # 先插入 authordetail 表中多数据

    insert into app01_authordetail(gender,tel,addr,birthday) values (1,13432335433,"华山","1994-5-23"), (1,13943454554,"黑木崖","1961-8-13"), (0,13878934322,"黑木崖","1996-5-20")

    # 再将数据插入 author,这样 author 才能找到 authordetail

    insert into app01_author(name,age,au_detail_id) values ("令狐冲",25,1), ("任我行",58,2), ("任盈盈",23,3)

    ORM - 添加数据

    一对多(外键 ForeignKey)

    方式一: 传对象的形式,返回值的数据类型是对象,书籍对象。

    步骤:

    a. 获取出版社对象

    b. 给书籍的出版社属性 pulish 传出版社对象

    def add_book(request):
        #  获取出版社对象
        pub_obj = models.Publish.objects.filter(pk=1).first()
        #  给书籍的出版社属性publish传出版社对象
        book = models.Book.objects.create(title="菜鸟教程", price=200, pub_date="2010-10-10", publish=pub_obj)
        print(book, type(book))

    方式二: 传对象 id 的形式(由于传过来的数据一般是 id,所以传对象 id 是常用的)。

    一对多中,设置外键属性的类(多的表)中,MySQL 中显示的字段名是:外键属性名_id

    返回值的数据类型是对象,书籍对象。

    步骤:

    a. 获取出版社对象的 id

    b. 给书籍的关联出版社字段 pulish_id 传出版社对象的 id

    def add_book(request):
        #  获取出版社对象
        pub_obj = models.Publish.objects.filter(pk=1).first()
        #  获取出版社对象的id
        pk = pub_obj.pk
        #  给书籍的关联出版社字段 publish_id 传出版社对象的id
        book = models.Book.objects.create(title="冲灵剑法", price=100, pub_date="2004-04-04", publish_id=pk)
        print(book, type(book))

    多对多(ManyToManyField):在第三张关系表中新增数据

    方式一: 传对象形式,无返回值。

    步骤:

    a. 获取作者对象

    b. 获取书籍对象

    c. 给书籍对象的 authors 属性用 add 方法传作者对象

    def add_book(request):
        #  获取作者对象
        chong = models.Author.objects.filter(name="令狐冲").first()
        ying = models.Author.objects.filter(name="任盈盈").first()
        #  获取书籍对象
        book = models.Book.objects.filter(title="菜鸟教程").first()  # 返回查询集中的第一个对象
        #  给书籍对象的 authors 属性用 add 方法传作者对象
        book.authors.add(chong, ying)


    关联管理器(对象调用)

    前提:

    • 多对多(双向均有关联管理器)
    • 一对多(只有多的那个类的对象有关联管理器,即反向才有)

    语法格式:

    正向:属性名
    反向:小写类名加_set

    注意:一对多只能反向

    常用方法:

    add():用于多对多,把指定的模型对象添加到关联对象集(关系表)中。

    注意:add() 在一对多(即外键)中,只能传对象( *QuerySet数据类型),不能传 id(*[id表])。

    *[ ] 的使用:

    # 方式一:传对象

    book_obj = models.Book.objects.get(id=10)
    author_list = models.Author.objects.filter(id__gt=2)  # 查询id大于2作者
    book_obj.authors.add(*author_list)  # 将 id 大于2的作者对象添加到这本书的作者集合中
    # 方式二:传对象 id
    book_obj.authors.add(*[1,3]) # 将 id=1 和 id=3 的作者对象添加到这本书的作者集合中

    反向:小写表名_set

    多(作者Author)对多(书Book:authors = models.ManyToManyField("Author"))

    ying = models.Author.objects.filter(name="任盈盈").first()
    book = models.Book.objects.filter(title="冲灵剑法").first()
    ying.book_set.add(book)


    create():创建一个新的对象,并同时将它添加到关联对象集之中。

    返回新创建的对象。

    pub = models.Publish.objects.filter(name="明教出版社").first()
    wo = models.Author.objects.filter(name="任我行").first()
    book = wo.book_set.create(title="吸星大法", price=300, pub_date="1999-9-19", publish=pub)
    print(book, type(book))


    remove():从关联对象集中移除执行的模型对象。

    对于 ForeignKey 对象,这个方法仅在 null=True(可以为空)时存在,无返回值。

    author_obj =models. Author.objects.get(id=1)
    book_obj = models.Book.objects.get(id=11)
    author_obj.book_set.remove(book_obj)


    clear():从关联对象集中移除一切对象,删除关联,不会删除对象。

    对于 ForeignKey 对象,这个方法仅在 null=True(可以为空)时存在。

    无返回值。

    #  清空独孤九剑关联的所有作者
    book = models.Book.objects.filter(title="菜鸟教程").first()
    book.authors.clear()


    ORM 查询

    基于对象的跨表查询。

    正向:属性名称

    反向:小写类名_set

    一对多

    查询主键为 10 的书籍的出版社所在的城市(正向)。

    book = models.Book.objects.filter(pk=10).first()
    res = book.publish.city
    print(res, type(res))


    查询明教出版社出版的书籍名(反向)。

    反向:对象.小写类名_set(pub.book_set) 可以跳转到关联的表(书籍表)。

    pub.book_set.all():取出书籍表的所有书籍对象,在一个 QuerySet 里,遍历取出一个个书籍对象。

    pub = models.Publish.objects.filter(name="明教出版社").first()
    res = pub.book_set.all()
    for i in res:
        print(i.title)


    一对一

    查询令狐冲的电话(正向)

    正向:对象.属性 (author.au_detail) 可以跳转到关联的表(作者详情表)

    author = models.Author.objects.filter(name="令狐冲").first()
    res = author.au_detail.tel
    print(res, type(res))


    查询所有住址在黑木崖作者的姓名(反向)。

    一对一的反向,用 对象.小写类名 即可,不用加 _set。

    反向:对象.小写类名(addr.author)可以跳转到关联的表(作者表)。

    addr = models.AuthorDetail.objects.filter(addr="黑木崖").first()
    res = addr.author.name
    print(res, type(res))


    多对多

    菜鸟教程所有作者的名字以及手机号(正向)。

    正向:对象.属性(book.authors)可以跳转到关联的表(作者表)。

    作者表里没有作者电话,因此再次通过对象.属性(i.au_detail)跳转到关联的表(作者详情表)。

    book = models.Book.objects.filter(title="菜鸟教程").first()
    res = book.authors.all()
    for i in res:
        print(i.name, i.au_detail.tel)


    查询任我行出过的所有书籍的名字(反向)。

    author = models.Author.objects.filter(name="任我行").first()
    res = author.book_set.all()
    for i in res:
        print(i.title)


    基于双下划线的跨表查询

    正向:属性名称__跨表的属性名称

    反向:小写类名__跨表的属性名称

    一对多

    查询菜鸟出版社出版过的所有书籍的名字与价格。

    res = models.Book.objects.filter(publish__name="菜鸟出版社").values_list("title", "price")


    反向:通过 小写类名__跨表的属性名称(book__title,book__price) 跨表获取数据。

    res = models.Publish.objects.filter(name="菜鸟出版社").values_list("book__title","book__price")


    多对多

    查询任我行出过的所有书籍的名字。

    正向:通过 属性名称__跨表的属性名称(authors__name) 跨表获取数据:

    res = models.Book.objects.filter(authors__name="任我行").values_list("title")

    反向:通过 小写类名__跨表的属性名称(book__title) 跨表获取数据:

    res = models.Author.objects.filter(name="任我行").values_list("book__title")


    一对一

    查询任我行的手机号。

    正向:通过 属性名称__跨表的属性名称(au_detail__tel) 跨表获取数据。

    res = models.Author.objects.filter(name="任我行").values_list("au_detail__tel")


    反向:通过 小写类名__跨表的属性名称(author__name) 跨表获取数据。

    res = models.AuthorDetail.objects.filter(author__name="任我行").values_list("tel")


     

     

    展开全文
  • 关系模型

    2017-03-06 20:36:56
    关系数据结构——关系,即关系模型种的数据的逻辑结构是一张扁平的二维(简单,能描述出现实世界的实体以及实体的各种联系).在关系模型中,现实世界的实体以及实体的各种联系均用单一的结构类型,即关系来...

    介绍

    数据库的第二次介绍,主要集中在关系模型上,并引出SQL语言

    关系模型

    关系数据库是支持关系模型的数据库系统

    关系模型的三要素:

    1. 关系数据结构——关系,即关系模型种的数据的逻辑结构是一张扁平的二维表(简单,能描述出现实世界的实体以及实体间的各种联系).在关系模型中,现实世界的实体以及实体间的各种联系均用单一的结构类型,即关系来表示。

    2. 关系操作
      基本的关系操作有:query,insert,delete,update.**关系操作的对象和结合都是集合。**query操作分为:select(选择),project(投影),join(连接),除(divide),并(union),差(except),交(intersection),笛卡尔积等
      关系数据语言分为三类:
      (1)关系代数语言(如ISBL)
      (2)关系演算语言(元组关系演算语言,ALPHA、QUEL。域关系演算语言,QBE)
      (3)具有关系代数和关系演算双重特点的语言(如SQL)

      1. 关系完整性约束
        关系完整性约束有:
        (1)实体完整性,主属性不能为空
        (2)参照完整性,外码参照其他关系,则外码需要在此其他关系中存在唯一(要么为空值,要么为被参照关系中的值
        (3)用户定义的完整性,用户自定义的一些约束条件

    SQL

    SQL,一种高度非过程化的语言,用户不必请求数据库管理员为其建立特殊的存取路径,存取路径的选择由关系数据库管理系统的优化机制来完成。也是关系数据库中处理业务逻辑过程中很重要的一种需要掌握的数据库语言。

    展开全文
  • 关系模型的概念详见百度:关系模型 实际的关系数据库中的关系也称,一个关系数据库就是由若干个组成(想象一下sqlserver)。...关系模型是指用二维的形式表示实体和实体联系的数据模型。 ...
  • 关系模型是1970年由E.F.Codd提出的,用以表示实体和实体联系的数据模型。关系就是包含行与列表,会随时间变化而变化,一个若干个可组成关系数据库;而关系模型是符合一定条件的相对固定的关系模式。关系模型由...
  • 本文将通过一个示例,介绍模型的定义,创建模型关联关系,模型与关联关系同步数据库,及关系模型的增、删、改、查操作。 数据库中的之间存在一定的关联关系,之间的关系基于主/外键进行关联、创建约束等。关系...
  • 关系模型和关系运算

    千次阅读 2015-11-09 22:52:54
    我们可以通过关系模型这种简单的数据结构能够描述出现实世界的实体及实体的各种联系。 什么是关系模型关系模型的基本假定是所有数据都表示为数学上的关系,就是以集合的形式表示。关系模型是采用二维表格...
  • 本文将通过一个示例,介绍模型的定义,创建模型关联关系,模型与关联关系同步数据库,及关系模型的增、删、改、查操作。 数据库中的之间存在一定的关联关系,之间的关系基于主/外键进行关联、创建约束等。关系...
  • 关系模型中无论是实体还是实体的联系均由单一的结构类型——关系来表示。在实际的关系数据库中的关系也称。一个关系数据库就是由若干个组成。关系模型本质上就是若干个存储数据的二维,可以把它们看作很多...
  • 关系模型的数据结构 关系模型源于数学 它用二维来组织数据 而这个二维在关系数据库中称为 关系 关系数据库是的集合 用关系表示实体以及实体的联系的模型 称为关系模型 下面我们来看看关系 模型中的基本术语 ...
  • Eloquent是Laravel的ORM(Object Relational Mapping,对象关系映射),Eloquent让每一个Model类对应一张数据库,以简便调用Model实现数据库的增删改查等操作。 2.Eloquent集合 集合(collection)也是迭代器,允许像...
  • 针对现有多种表达模型不能定量表达空间目标方向关系问题,采用统计模型的定量表达方法,通过AUTOLISP语言编程计算得到折线目标相对于点目标的方向值分布范围,对这组统计值进行排序,求出中值方向,实现以点为参考目标...
  • 一对一是最简单的关联关系,表示A和B的记录一一对应,假设一个用户对应一个/角色, 如果有两个模型:User 和 Role他们是一对一的关系, 那么我们要使用 Eloquent 提供的一对一关系方法,结构应该是这样的 ...
  • 关系模型我的理解

    2019-10-03 13:56:45
    描述数据的关系 1、集合关系;2、依赖关系; 以类型为基础的数据的集合:; ...存在数据依赖的多个:联系 ...现实世界的实体以及实体的各种联系均用关系来表示,从用户角度看,关系模型中数据的逻辑...
  • 模型间关系本质上是对其代表的数据库中之间的关系描述,通过这些关系可以实现数据库中之间主/外键约束的创建。查询时也可以基于这些关系,生成在数据库中执行的连接查询或复合查询SQL语句。1. 关系/关联的使用...
  • ER模型向关系模型的转换规则

    千次阅读 2020-03-11 12:16:44
    ER模型向关系模型的转换规则 ER模型向关系模型的转换,实际上就是把ER图转换成关系模式的集合。 规则1(实体类型的转换) 将每个实体类型转换成一个关系模式/,实体的属性即为关系模式的属性,实体标识符即为...
  • 关系模型: 关系型数据库:是支持关系数据模型的数据库系统;目前关系型数据库是主流的数据库管理系统。 关系模型:由关系数据结构、关系操作集合和关系完整性约束三部分组成。 关系数据结构:实际上她就是一张...
  • ER模型、OO模型、关系模型的关系

    千次阅读 2009-11-30 22:04:00
    E-R(实体-联系模型):概念模型。现实世界->信息世界,需求调研和建模阶段使用。OO模型(面向对象模型):编程模型。纯业务流程:静态、实例方法类来实现...用来维护实体和实体间关系,主码和外键是两个要素。如果加
  • 在实际开发中经常用到分库分表,比如用户分成 100 张,那么这个时候查询数据需要设置分表,比如 Laravel 的 Model 类中提供了 setTable 方法: /** * Set the table associated with the model. * * @param ...
  • 数据库表间存在若干关系  万事万物也存在若干关系 2. 对象间有几种关联关系 单向 :你中有我,我中没你 双向:你中有我,我中有您。 3. 关系型数据与对象型数据 数据库:存放关系模型的数据 java:存放对象...
  • 在实际开发中经常用到分库分表,比如用户分成 100 张,那么这个时候查询数据需要设置分表,比如 Laravel 的 Model 类中提供了 setTable 方法: /** * Set the table associated with the model. * * @...
  • 在实际开发中经常用到分库分表,比如用户分成 100 张,那么这个时候查询数据需要设置分表,比如 Laravel 的 Model 类中提供了 setTable 方法:/** * Set the table associated with the model. * * @param ...
  • 约束(约束是添加在列上的,用来约束列的) 1. 主键约束(唯一标识) 特性: ****非空*** ****唯一*** ****被引用****(学习外键时) * 当的某一列被指定为主键后,该列就... * 创建时指定主键的两种方式:...
  • 模型间关系本质上是对其代表的数据库中之间的关系描述,通过这些关系可以实现数据库中之间主/外键约束的创建。查询时也可以基于这些关系,生成在数据库中执行的连接查询或复合查询SQL语句。关系/关联的使用1.1...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,272
精华内容 508
关键字:

关系模型表间关系