文章目录

  • 1.基本概念
  • 2.关系型数据库
  • 相关概念:
  • 3.联系
  • 4.多对多的关系
  • 5.结合EF core 理解多对多
  • 1.Model配置
  • 2.多对多
  • 6.关系数据库
  • 6.1相关概念
  • 6.2 二维表的6条性质
  • 6.3 表的操作
  • 6.4表的完整性
  • 7.范式
  • 参考文献



如下内容讲的,主要是关系型数据库


1.基本概念

信息世界的一些基本的概念

  • 实体:一个人,一个部门,一个学生,一门课,学生的一次选课。
  • 属性:一个实体可以用若干属性来刻画。例如学生可以用学号、姓名。
  • 实体型:例如:学生(学号,姓名,性别,出生年月,所在院系)
  • 实体集:例如:全体学生就是一个实体集

实体内部的联系,通常指组成实体的各属性之间的联系

实体之间的联系,通常指实体集之间的联系





2.关系型数据库

关系型数据库系统,采用关系模型作为数据的组织方式,就是一张规范的二维表

android 数据库字段是实体类 数据库实体类型_多对多

相关概念:

  • 关系:通常说就是一张表。
  • 元组:表中的一行,即一个元组。
  • 属性:表中的一列,即一个属性。
  • 码:表中的某个属性组,他可以唯一确定一个元组。
  • 域:域是一组具有相同数据类型的值得集合。属性的取值来自于某个域,例如人的年龄一般是在(1-120)中间。 (笛卡尔积就是域上的一种集合运算。)
  • 分量:元组中的一个属性值。

关系的每一个分量,必须是一个不可分的数据项,也就是说不允许表中还有表

android 数据库字段是实体类 数据库实体类型_多对多_02




3.联系

实体之间的联系,有一对一,一对多,多对多等多种类型

  • 如果实体集 A 中的每一个实体,实体集 B 至多有一个实体(也可以没有)与之联系,反之亦然,则实体集 A 与 实体集 B 具有一对一联系
  • 如果实体集 A 中的每一个实体,实体集B中,有 n 个实体(n>=0)与之联系,反之,对于实体集B中的每个实体,实体集A中,至多只有一个实体与之联系,则称实体集A与实体集B有一对多联系
  • 如果实体集 A 中的每一个实体,实体集 B 中有n个实体(n>=0)与之联系,反之,对于实体集 B 中的每个实体,实体集A中也有m个实体(m>=0)与之联系。则称实体集A与实体集B具有多对多的关系




4.多对多的关系

多对多关系也很常见,例如学生与选修课之间的关系,一个学生可以选择多门选修课,而每个选修课又可以被多名学生选择。

数据库中的多对多关联关系一般需采用中间表的方式处理,将多对多转化为两个一对多。





5.结合EF core 理解多对多

1.Model配置

一对多

以city和Province为例,Province有多个city,而一个city只能有一个Province

using System;
using Microsoft.EntityFrameworkCore;
 
namespace ASPNetEFFCore.Models
{
    public class MyContext:DbContext
    {
        public MyContext(DbContextOptions<MyContext> options):base(options)
        {
        }
 
       protected override void OnModelCreating(ModelBuilder modelBuilder){
 
            //配置多对多 ,就是两个一对多,可以不写
 
            modelBuilder.Entity<City>().HasOne(city => city.Province).WithMany(x => x.Cities).HasForeignKey(city => .ProviceId);
        }
 
        public DbSet<Province> Provinces { get; set; }
        public DbSet<City> Cities { get; set; }
 
 
    }
    public class Province
    {
        public Province()
        {
            Cities = new List<City>();
        }
 
        public int Id { get; set; }
        public string Name { get; set; }
        public int Population { get; set; }
        public List<City> Cities { get; set; }
    }
 
     public class City
    {
     
 
        public int Id { get; set; }
        public string Name { get; set; }
        public string AreaCode { get; set; }
        public int ProviceId { get; set; }
        public Province Province { get; set; }
 
         public Mayor Mayor {get;set;}
    }
}

2.多对多

以city和company为例,一个city会有多个company,一个company在多个city都有多个分company

using System;
using Microsoft.EntityFrameworkCore;
 
namespace ASPNetEFFCore.Models
{
    public class MyContext:DbContext
    {
        public MyContext(DbContextOptions<MyContext> options):base(options)
        {
        }
 
       protected override void OnModelCreating(ModelBuilder modelBuilder){
           //使用x.CityId,x.CompanyId生成 cityCompany的联合主键
           //执行数据库迁移
           modelBuilder.Entity<CityCompany>().HasKey(x => new{x.CityId,x.CompanyId});
 
            //配置多对多 ,就是两个一对多,可以不写
           modelBuilder.Entity<CityCompany>().HasOne(x => x.City).WithMany(x=> x.CityCompany).HasForeignKey(x=>x.CityId);
         modelBuilder.Entity<CityCompany>().HasOne(x => x.Company).WithMany(x=> x.CityCompany).HasForeignKey(x=>x.CompanyId);
    
        }
  
        public DbSet<City> Cities { get; set; }
 
        public DbSet<CityCompany> cityCompanies {get;set;}
    }
    
    public class City
    {
         public City()
        {
            CityCompany = new List<CityCompany>();
        }
 
        public int Id { get; set; }
        public string Name { get; set; }
        public string AreaCode { get; set; }
        public int ProvinceId { get; set; }
        public Province Province { get; set; }
 
        //多对多映射
        public List<CityCompany> CityCompany {get;set;}
    }
 
     public class Company
    {
        public Company()
        {
            CityCompany = new List<CityCompany>();
        }
 
        public int Id {get;set;}
        public string Name {get;set;}
        public DateTime EstablishDate {get;set;}
        public string LegalPerson {get;set;}
 
        //多对多映射
        public List<CityCompany> CityCompany {get;set;}
    }
    //多对多中间model
    public class CityCompany
    {
       public int CityId {get;set;}
       public City City{get;set;}
       public int CompanyId {get;set;} 
       public Company Company {get;set;}
    }
}




6.关系数据库

6.1相关概念

理解什么是笛卡尔积,什么是域,什么是基数,

android 数据库字段是实体类 数据库实体类型_ci_03


android 数据库字段是实体类 数据库实体类型_实体集_04


6.2 二维表的6条性质

  1. 列是同质的,每一个列的分量是同一类型的数据,来自同一个域
  2. 不同的类,可能出自同一个域
  3. 列的顺序是无所谓的
  4. 行的顺序是无所谓的
  5. 任意两行的候选码不能取相同值
  6. 分量必须取原子,即每个分量都必须是不可分的数据项

在实际的生产中,基本表并不完全具有这6条特征,例如有些数据库产品仍然区分了属性的顺序和元组的顺序。




6.3 表的操作

关系模型中,常用的操作,包括查询、插入、删除、修改.
查询又可以分为选择、投影、并、差、笛卡尔积 等五种操作。

关系操作的特点是集合操作,即操作的对象和结果都是集合。




6.4表的完整性

数据库表的完整性是对关系的某种约束条件,也就是说关系的值随着时间的变化时应该满足的一些约束条件。




7.范式

7.1 第一范式

只要表中不再含有其他的表,就说明了符合第一范式

7.2下面表存在的问题

android 数据库字段是实体类 数据库实体类型_多对多_05

  1. 数据冗余:每个系班主任名字重复出现,而且重复次数和所有学生的所有课程成绩出现次数一样。
  2. 更新异常
  3. 插入异常
  4. 删除异常