精华内容
下载资源
问答
  • 在日常项目中,发现公司初级、中级研发同事在系统表结构设计或数仓表结构设计过程中,很多人都没有听说过概念模型、逻辑模型、物理模型,所以今天这篇文章和大家一起梳理下,什么是概念模型、逻辑模型、物理模型。...

    在日常项目中,发现公司初级、中级研发同事在系统表结构设计或数仓表结构设计过程中,很多人都没有听说过概念模型、逻辑模型、物理模型,所以今天这篇文章和大家一起梳理下,什么是概念模型、逻辑模型、物理模型。

    为什么要分开成三个步骤:概念模型阶段->逻辑模型阶段->物理模型阶段   进行表结构设计,这样做的优点是什么;(推荐大家使用powerDesigner进行概念模型、逻辑模型、物理模型设计本文powerdesigern设计的学生管理系统demo百度云网盘下载地址,可关注微信公众号:大数据架构师之路复 学生管理系统模型  获取)

    一、概念模型阶段

    概念模型阶段要做的事,总结一句话来说,"找到你开发设计的系统,业务层面核心的实体和关系

    举个例子,我们准备要开发一个校园管理系统,通过和产品经理、需求方沟通,这个系统主要目的是为了解决学生、班级、老师之间归属关系录入、统计和查看。

    在概念模型阶段,我们可以将我们涉及到业务层面的核心的三个实体 1、学生  2、班级  3、老师 ;

    归属关系 :

    1、班级与学生是属于一对多的关系:一个班级至少有一个或多个学生,每个学生只能归属于一个班级;

    2、老师与班级是属于多对多的关系:一个班级至少有一个或多个老师,一个老师至少属于一个或多个班级;

    3、老师与课程是属于一对多的关系:一个老师只能教授一门课程,多个老师可以教授同一门课程;我们使用powerdesigner画出来的概念模型如下:

    640?wx_fmt=png

    二、逻辑模型阶段

    逻辑模型阶段要做的事,总结一句话来说,“整理完善系统所有实体、实体间的关系,给实体添加字段属性”;

    例如班级这个实体,我们需要将班级ID、班级名称等 班级实体下的所有字段属性梳理出来,并将这些字段的长度和约束确定下来;

    实体字段属性定义要尽量满足三范式定义,在下一个章节我们会讲到什么是三范式,为什么要遵循三范式

    此时多对多的关系,例如老师与班级的归属关系,我们需要单独建立一张关系表,进行处理;我们使用powerdesigner画出来的逻辑模型如下:

    640?wx_fmt=png

    三、物理模型阶段

    物理模型阶段要做的事,总结一句话来说,"通过case工具(例如:powerdesigner)由逻辑模型自动生成物理模型(可生成不同数据库类型的DDL语句、数据字典)",生成的逻辑模型如下:

    640?wx_fmt=png

    可直接生成DDL语句

    640?wx_fmt=png

    四、优点总结:

    1、减少团队成员间日常沟通成本:一般想要快速熟悉系统和业务,从数据库梳理是最快的,但如果只有数据库DDL语句注释,那最多了解到6、7成,因为表之间关联关系,只看DDL是看不出来,那就需要去问,新同事入职要问老同事,数据团队要问要问系统研发团队。。。

    2、数据治理的关键,数据模型管理是数据治理最重要的一个环节之一,按规范来设计,可以将研发->dba->数据分析团队职能高效的串联起来,保证平台数据质量的可控性。

    展开全文
  • 关系模型的数据结构 关系模型源于数学 它用二维来组织数据 而这个二维在关系数据库中称为 关系 关系数据库是的集合 用关系表示实体以及实体间的联系的模型 称为关系模型 下面我们来看看关系 模型中的基本术语 ...
  • 对于数据库来说一般表结构只会有三种对应关系,分别是一对一、一对多和多对一,下面分别介绍: 1.一对多 何为一对多,例如一个学生只可能有一个班级,一个班级却又多个学生,班级表和学生表就是一对多的关系。 在...

    对于数据库来说一般表结构只会有三种对应关系,分别是一对一、一对多和多对一,下面分别介绍:

    1.一对多

    何为一对多,例如一个学生只可能有一个班级,一个班级却又多个学生,班级表和学生表就是一对多的关系。

    在查询信息的时候有两种方式:正向查询和反向查询。

    (1)正向查询

    复制代码
    models.Student.objects.first()
    <Student: Student object>#返回一个学生对象
    models.Student.objects.first().sname  #可以查询学生信息
    '科比'
    models.Student.objects.first().cid  #由于有关联,可以直接获取班级对象
    <Class: Class object>
    models.Student.objects.first().cid.cname  #查询班级属性
    '全栈6期'
    models.Student.objects.first().cid.first_day
    datetime.date(2017, 7, 14)
    复制代码

     

    (2)反向查询

    复制代码
    models.Class.objects.filter(id=3)
    <QuerySet [<Class: Class object>]>
    #这是一个班级Queryset
    
    models.Class.objects.filter(id=3)[0]
    <Class: Class object>
    #获取班级对象
    
    models.Class.objects.filter(id=3)[0].cname
    '全栈8期'
    #既然是对象就可以查看相关属性
    
    models.Class.objects.filter(id=3)[0].student_set
    <django.db.models.fields.related_descriptors.create_reverse_many_to_one_manager.<locals>.RelatedManager object at 0x0000019A6A928FD0>
    #反向查找学生,获取学生集合,这是Django自己的模式
    
    models.Class.objects.filter(id=3)[0].student_set.all()
    <QuerySet [<Student: Student object>, <Student: Student object>]>
    #查看集合中所有的对象
    
    models.Class.objects.filter(id=3)[0].student_set.all().values()
    <QuerySet [{'id': 8, 'sname': '小鸟', 'cid_id': 3}, {'id': 11, 'sname': '大爷', 'cid_id': 3}]>
    #可以进一步查看相关属性
    复制代码

    注意:

    如果不在外键的字段中设置related_name的话,默认就用表名_set.

    如果设置了related_name=“students”,反向查找时可以直接使用student进行反向查找。

    >>> class_obj.students.all() 
    #直接获取班级中的学生,而不需要set

     

    2.一对一

    表结构设计

    复制代码
    class Student(models.Model):
        id = models.AutoField(primary_key=True)
        sname = models.CharField(max_length=32)
        cid = models.ForeignKey("Class")
        detail = models.OneToOneField(to="StudentInfo", null=True)
    
    class StudentInfo(models.Model):
        height = models.CharField(max_length=4)
        weight = models.CharField(max_length=4)
        addr = models.CharField(max_length=32,null=True)
    复制代码

    (1)正向查询

    复制代码
    models.Student.objects.first()
    <Student: Student object>
    #获得一个对象
    
    models.Student.objects.first().detail.addr
    '罗田'
    #正向查询获取属性,通过关联字段直接找
    复制代码

     

    (2)反向查询

    复制代码
    models.StudentInfo.objects.filter(height=180)
    <QuerySet [<StudentInfo: StudentInfo object>]>
    #获得一个Queryset
    
    models.StudentInfo.objects.filter(height=180)[0].student
    <Student: Student object>
    #反向查找学生,返回一个对象
    
    models.StudentInfo.objects.filter(height=180)[0].student.sname
    '小鸟'
    #查看学生信息
    复制代码

     

    3.多对多

    1)创建多对多的对应关系有三种方法:

    (1)通过外键创建

    复制代码
    class Class(models.Model):
        id = models.AutoField(primary_key=True)  # 主键
        cname = models.CharField(max_length=32)  # 班级名称
        first_day = models.DateField()  # 开班时间
    
    
    class Teacher(models.Model):
        tname = models.CharField(max_length=32)
    
    
    # 自定义第三张表,通过外键关联上面两张表
    class Teacher2Class(models.Model):
        teacher = models.ForeignKey(to="Teacher")
        the_class = models.ForeignKey(to="Class")
    
        class Meta:
            unique_together = ("teacher", "the_class")  #指定联合唯一
    复制代码

    (2)通过ManyToManyField创建

    复制代码
    class Class(models.Model):
        id = models.AutoField(primary_key=True)  # 主键
        cname = models.CharField(max_length=32)  # 班级名称
        first_day = models.DateField()  # 开班时间
    
    
    class Teacher(models.Model):
        tname = models.CharField(max_length=32)
        # 通过ManyToManyField自动创建第三张表
        cid = models.ManyToManyField(to="Class", related_name="teachers")
    复制代码

    这种方法会自动生成一张对应表,但是不能使用多对多的众多方法。

     

    (3)通过外键和ManyToManyField创建

    复制代码
    class Class(models.Model):
        id = models.AutoField(primary_key=True)  # 主键
        cname = models.CharField(max_length=32)  # 班级名称
        first_day = models.DateField()  # 开班时间
    
    
    class Teacher(models.Model):
        tname = models.CharField(max_length=32)
        # 通过ManyToManyField和手动创建第三张表
        cid = models.ManyToManyField(to="Class", through="Teacher2Class", through_fields=("teacher", "the_class"))
    
    
    class Teacher2Class(models.Model):
        teacher = models.ForeignKey(to="Teacher")
        the_class = models.ForeignKey(to="Class")
    
        class Meta:
            unique_together = ("teacher", "the_class")
    复制代码

    貌似这种方法最为靠谱,但是最麻烦。

     

    2)查询的方法

    (1)正向查询(由老师表查询班级)

    复制代码
    models.Teacher.objects.first()
    <Teacher: Teacher object>
    #获取一个老师的对象
    
    models.Teacher.objects.first().cid
    <django.db.models.fields.related_descriptors.create_forward_many_to_many_manager.<locals>.ManyRelatedManager object at 0x000001FE3916A518>
    #获取老师所对应的班级
    
    models.Teacher.objects.first().cid.all()
    <QuerySet [<Class: Class object>, <Class: Class object>]>
    #获取所有班级对象
    
    models.Teacher.objects.first().cid.all().values()
    <QuerySet [{'id': 1, 'cname': '全栈6期', 'first_day': 
    datetime.date(2017, 7, 14)}, {'id': 3, 'cname': '全栈8期', 'first_day': datetime.date(2017, 10, 17)}]>
    #查看所有值
    复制代码

    为什么能够直接找到班级?

    答案是:通过关联字段

     

    (2)反向查询(由班级表反向查询老师表)

    复制代码
    models.Class.objects.first()
    <Class: Class object>
    #获取班级对象
    
    models.Class.objects.first().teachers
    <django.db.models.fields.related_descriptors.create_forward_many_to_many_manager.<locals>.ManyRelatedManager object at 0x000001FE3918C390>
    
    models.Class.objects.first().teachers.all().values()
    <QuerySet [{'id': 1, 'tname': '爱根'}, {'id': 4, 'tname': '日天'}, {'id': 6, 'tname': '银角大王'}]>
    #由班级反向查老师
    
    models.Class.objects.first().teachers.all()
    <QuerySet [<Teacher: Teacher object>, <Teacher: Teacher object>, <Teacher: Teacher object>]>
    复制代码

    刚才正向查找的时候,是因为老师表种由cid这个字段,所以可以直接查找,但是现在这个是怎么关联上的了?请看下面

    cid = models.ManyToManyField(to="Class", related_name="teachers")

    关联的时候设置了related_name,所以可以反向查找。

    注意:这里不能使用teacher_set这种方式,而在一对多种可以使用

    来看看各种对应关系的正向查找:

    复制代码
    #一对多正向查找(学生表——》班级表)
    models.Student.objects.first().cid
    
    #一对一正向查找(学生表——》学生信息表)
    models.Student.objects.first().detail.addr
    
    
    #多对多正向查找(老师表到班级表)
    models.Teacher.objects.first().cid.all()
    
    #正向查找是表中必须有的字段
    复制代码

    来看看各种对应关系的反向查找:

    反向查找是相对于正向查找来说的。

    #一对多反向查找(班级表——》学生表)
    models.Class.objects.filter(id=3)[0].student_set.all()
    
    #一对一反向查找(后面直接可查属性)(学生信息表——》学生表)
    models.StudentInfo.objects.filter(height=180)[0].student
    
    #多对多反向查找(班级表——》老师表)
    models.Class.objects.first().teachers.all()

     

    转载于:https://www.cnblogs.com/yangmingxianshen/p/8344151.html

    展开全文
  •  关系模型以二维表结构来表示实体与实体之间的联系,它是以关系数学理论为基础的,每个二维表又可称为关系。  在关系模型中,操作的对象和结果都是二维表,关系模型是目前最流行的数据库模型。支持关系模型的...

      已经讲了数据结构的层次模型和网状模型,最后再看下第三种模型,关系模型。

      关系模型以二维表结构来表示实体与实体之间的联系,它是以关系数学理论为基础的,每个二维表又可称为关系。

      在关系模型中,操作的对象和结果都是二维表,关系模型是目前最流行的数据库模型。支持关系模型的数据库管理系统称为关系数据库管理系统,Access就是一种关系数据库管理系统。

      1、基本术语

      (1)关系(Relation):一个关系对应着一个二维表,二维表就是关系名。

      (2)元组(Tuple):在二维表中的一行,称为一个元组。

      (3)属性(Attribute):在二维表中的列,称为属性。属性的个数称为关系的元或度。列的值称为属性值;

      (4)(值)域(Domain):属性值的取值范围为值域。

      北京整容http://www.bj-swjtu.com

      (5)分量:每一行对应的列的属性值,即元组中的一个属性值。[2]

      (6)关系模式:在二维表中的行定义,即对关系的描述称为关系模式。一般表示为(属性1,属性2,......,属性n),如老师的关系模型可以表示为教师(教师号,姓名,性别,年龄,职称,所在系)。

      (7)键(码):如果在一个关系中存在唯一标识一个实体的一个属性或属性集称为实体的键,即使得在该关系的任何一个关系状态中的两个元组,在该属性上的值的组合都不同。

      (8)候选键(候选码):若关系中的某一属性的值能唯一标识一个元组如果在关系的一个键中不能移去任何一个属性,否则它就不是这个关系的键,则称这个被指定的候选键为该关系的候选键或者候选码。

      例如下列学生表中“学号”或“图书证号”都能唯一标识一个元组,则“学号”和“图书证号”都能唯一地标识一个元组,则“学号”和“图书证号”都可作为学生关系的候选键。

      

      而在选课表中,只有属性组“学号”和“课程号”才能唯一地标识一个元组,则候选键为(学号,课程号)。

      

      2、关系模型的数据操作与完整性约束

      关系数据模型的操作主要包括查询、插入、删除和修改数据;这些操作必须满足关系的完整性约束条件。

      关系模型中数据操作的特点是集合操作方式,即操作对象和操作结果都是集合,这种操作方式也称为一次一集合的方式。

      相应地,非关系数据模型的操作方式是一次一记录的方式。

      关系的完整性约束条件包括三大类:

      实体完整性、参照完整性和用户定义的完整性。

      实体完整性定义数据库中每一个基本关系的主码应满足的条件,能够保证元组的唯一性。参照完整性定义表之间的引用关系,即参照与被参照关系。用户定义完整性是用户针对具体的应用环境制定的数据规则,反映某一具体应用所涉及的数据必须满足的语义要求。

      3、关系模型的优缺点

      关系数据模型的优点主要体现在以下几点:

      (1) 关系模型与非关系模型不同,它是建立在严格的数学理论基础上的。

      (2) 关系模型的概念单一,实体与实体间的联系都用关系表示,对数据的检索结果也是关系(即表),所以其数据结构简单、清晰,用户易懂易用。

      (3) 关系模型的物理存储和存取路径对用户透明,从而具有更高的数据独立性、更好的安全保密性,简化了程序员的数据库开发工作。

      关系数据模型的缺点有以下几点:

      (1) 由于存取路径对用户透明,查询效率往往不如非关系数据模型高。因此,为了提高性能,必须对用户的查询请求进行优化,这就增加了开发数据库管理系统的难度和负担。

      (2) 关系数据模型不能以自然的方式表示实体集间的联系,存在语义信息不足、数据类型过少等弱点。

      以上,简单了解~

    展开全文
  • 领域模型和数据库表结构对应关系

    千次阅读 2009-05-11 22:35:20
    譬如,在数据库中有一个T_USER,在程序中就会有User类,所以一般情况就一对一的映射关系了。   领域模型是对领域内的概念类或现实世界中对象的可视化表示。又称概念模型、领域对象模型、分析对象模型。它专注于...

          以前我自己做过的项目中和别人的项目中都有这样的一些定论,就是往往先设计数据库表模型,然后根据表产生业务逻辑模型。譬如,在数据库中有一个表T_USER,在程序中就会有User类,所以一般情况就一对一的映射关系了。

          领域模型是对领域内的概念类或现实世界中对象的可视化表示。又称概念模型、领域对象模型、分析对象模型。它专注于分析问题领域本身,发掘重要的业务领域概念,并建立业务领域概念之间的关系。

     

          数据库表结构一般都由领域模型来,除了能够保存领域模型外,还需要考虑数据库本身的特征。

     

          我们个举例:相信很多都办过信用卡,信用卡表上有申请人的基本信息,申请人工作信息,联系人信息,从领域模型角度来说有三个概念类:人的基本信类,工作信息类和联系人信息类,他们是组合关系。按照这样数据库表设计如下:

     




      这样设计看上去也没有问题,有很多人说这样很清楚,这基本上也是一对一的映射。但是从数据库角度来说这样是最优化的吗?我个人这样可以这样设计,将三个表合在一起(这样不会破坏领域模型的,Hinernate的component可以实现),如下图:


    当然也有它的缺点: 1.表操作比较频繁.2.表的扩展比较笨重

    这样要平衡一下了,从领域模型角度来说,其实他们是一个业务实体,组合关系,不可分割.所以说对实体操作,第一种方案也会对三个表操作,特别是查询,第一种方案有两个外键,显然没有第二种快了.

     

          所以大家在考虑领域模型或业务对象时,要按照他们本身的原则设计,不要依赖于数据库表的结构.反过来做数据库表设计的时候不竟要完成领域模型的数据要求,还要考虑数据库的性能问题.

     

     

     

    展开全文
  • ER图和关系模型到MySQL数据库

    千次阅读 2020-03-02 21:01:12
    本篇主要介绍了MySQL数据库表从ER图到关系模型,再到数据库表的创建过程及其表结构的修改。通过本篇的学习,可以掌握以下内容: ● 应用ER图和关系模型创建数据库表 ● 数据库表结构的修改 1、mooc数据库表的ER...
  • 关系模型的数据结构

    2021-03-21 08:46:06
    关系:一个关系对应通常所说的一张。 元组:中的一行即为一个元组。 属性:中的一列即为一个属性。 码(码键):中的某个属性组,它可以唯一确定一个元组。 分量:元组中的一个属性值。 域:一组具有相同数据...
  • 关系模型=关系数据结构+关系操作集合+关系完整性约束 关系数据结构:关系、关系模式、关系数据库 关系 关系也是一个二维的每行对应一个元组,的每列对应一个域,每一列称为一个属性,不同的属性要给予...
  • 数据库关系模型设计 背景 目前公司内部主流数据库是关系型数据库MySQL,数据库设计...相应的数据库架构、关系模型表结构越来越复杂,这时我们往往会发现我们写出来的SQL语句是很笨拙并且效率低下的。更可怕的是,由...
  • 文章目录表结构数据模型 表结构 1、概述 在HBase中插入数据时,先输入的数据的格式为:rowkey => info=>column=>value 结构 含义 rowkey 行键 info 列族 column 列 value 值 tomestamp ...
  • 关系表2.约束3.超键4.候选键5.主键6.外键 1.关系表 关系数据库使用一个或多个来存储数据 数学上,把一系列域上的笛卡尔积的子集称之为关系 eg: (1)examinee 每个行列单元都是不能再分的原子值; 不允许重复...
  • 本篇主要介绍了MySQL数据库表从ER图到关系模型,再到数据库表的创建过程及其表结构的修改。通过本篇的学习,可以掌握以下内容:● 应用ER图和关系模型创建数据库表● 数据库表结构的修改1、mooc数据库表的ER图和关系...
  • 如果你的类模型能够完整地转换为表结构(每一个表都能找到与之相关的类,如果类之间是多对多关系,那 么 会增加一个中间从类模型转换到数据库表结构的思考Aaron从类模型转换到数据库表结构,或者说从UML类图转换为ER...
  • 关系模型关系模型

    2016-10-15 11:11:00
    关系模型研究的内容 一个关系就是一个Table,关系模型就是处理Table的 在处理Table时涉及到以下内容 如何来描述一个Table,一个Table由哪些要素组成 规定Table上的操作和Table与Table之间的操作 定义的约束...
  • 比如:RBAC模型表结构该如何创建? 具体到某个页面,某个按钮权限是如何控制的? 为了配合登录验证表,用户表中应该包含哪些核心字段? 这些字段与登录验证或权限分配的需求有什么关系? 那么本文...
  • 本篇主要介绍了MySQL数据库表从ER图到关系模型,再到数据库表的创建过程及其表结构的修改。通过本篇的学习,可以掌握以下内容:● 应用ER图和关系模型创建数据库表● 数据库表结构的修改1、mooc数据库表的ER图和关系...
  • 关系模型的数据结构非常简单,只包含单一的数据结构---关系 关系有3种类型:基本关系(通常又称基本或者基表)、查询和视图 1、基本表示实际存在的,是实际存储数据的逻辑表示 2、查询是查询结果对应的...
  • 关系模型

    2020-07-22 21:53:37
    关系模型 关系模型是最重要的一种数据模型。关系数据库系统采用关系模型作为数据的组织方式。 关系模式的数据结构 关系模式是建立在严格的数学概念的基础上的。从用户观点看,关系模式由一组关系组成。每个关系的...
  • 数据库表结构关系图生成

    万次阅读 2019-12-08 06:21:09
    随便点击试一下,最后你会发现点击从左数第三个的时候,会变成我们想要的数据库表结构图 如果你想看他们单个的模型图,你可选中其中一个,右击鼠标,选择逆向表到模型图 然后就会弹出一个窗体 显示你要的模型图 ....
  • 树状结构Java模型、层级关系Java模型、上下级关系Java模型与html页面展示 一、业务原型:公司的组织结构、传销关系网 二、数据库模型 很简单,创建 id 与 pid 关系即可。(pid:parent_id) 三、Java...
  • 一个关系对应通常说的一张 元组( Tuple) 中的一行即为一个元组 属性( Attribute) 中的一列即为一个属性, 给每一个属性起一个名称即属性名 主码( Key) 中的某个属性组, 它可以唯一确定一个元组。 域...
  • 数据库管理系统的关系模型结构是什么发布时间:2020-11-12 11:31:42来源:亿速云阅读:74作者:小新了解数据库管理系统的关系模型结构是什么?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你...
  • csd-310 本课程从软件开发人员的角度... 主题包括定义键/值对,构建表结构,处理记录,使用数据类型以及实现访问控制。 结构化查询语言(SQL)将用于操纵模型。 学生将使用关系数据库管理系统准备一个小型应用程序。
  • 图(graph)是用于表示对象之间联结关系的抽象数据结构,通常使用顶点(vertex)集和边(edge)集进行描述:顶点表示对象,边表示对象之间的关系。根据边是否有方向和权值,图又可细分为有向图/无向图以及有权图/无权图等...
  • 关系型数据库的表结构 例如有一个用户表user_info,有字段:id、name、tel,表名和字段需要在建表时指定 create table user_info ( id 类型, name 类型, tel 类型 ) 然后插入两条数据 insert into user_info ...
  • 这是其他数据模型关系模型可以理解为一组关系,其中的每一个关系的数据结构都是一张规范化的二维关系模型要求关系是规范化,规范化的最基本条件就是关系的每一个分量都必须是不可再分的数据项,通俗的说法就是不...
  • 微观位错与整体结构件加工变形数学关系模型的构建,李明,杨勇,针对航空整体结构件的加工变形问题仍停留在表面研究,尚未深入到位错运动学微观层面上,在解决加工变形方面缺乏可靠的理论依据,
  • 本节书摘来华章计算机《数据库技术原理与应用教程》一书中的第3章 ,第3.5.3节,徐洁磐 操凤萍 编著更多章节内容可以访问云栖社区“华章计算机”公众号查看。...1 关系数据结构 (1)表结构关系模...

空空如也

空空如也

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

关系模型表结构