数据库の概念模型
文章目录
如下内容讲的,主要是关系型数据库
1.基本概念
信息世界的一些基本的概念
- 实体:一个人,一个部门,一个学生,一门课,学生的一次选课。
- 属性:一个实体可以用若干属性来刻画。例如学生可以用学号、姓名。
- 实体型:例如:学生(学号,姓名,性别,出生年月,所在院系)
- 实体集:例如:全体学生就是一个实体集
实体内部的联系,通常指组成实体的各属性之间的联系
实体之间的联系,通常指实体集之间的联系
2.关系型数据库
关系型数据库系统,采用关系模型作为数据的组织方式,就是一张规范的二维表
相关概念:
- 关系:通常说就是一张表。
- 元组:表中的一行,即一个元组。
- 属性:表中的一列,即一个属性。
- 码:表中的某个属性组,他可以唯一确定一个元组。
- 域:域是一组具有相同数据类型的值得集合。属性的取值来自于某个域,例如人的年龄一般是在(1-120)中间。 (笛卡尔积就是域上的一种集合运算。)
- 分量:元组中的一个属性值。
关系的每一个分量,必须是一个不可分的数据项,也就是说不允许表中还有表
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相关概念
理解什么是笛卡尔积,什么是域,什么是基数,
6.2 二维表的6条性质
- 列是同质的,每一个列的分量是同一类型的数据,来自同一个域
- 不同的类,可能出自同一个域
- 列的顺序是无所谓的
- 行的顺序是无所谓的
- 任意两行的候选码不能取相同值
- 分量必须取原子,即每个分量都必须是不可分的数据项
在实际的生产中,基本表并不完全具有这6条特征,例如有些数据库产品仍然区分了属性的顺序和元组的顺序。
6.3 表的操作
关系模型中,常用的操作,包括查询、插入、删除、修改.
查询又可以分为选择、投影、并、差、笛卡尔积 等五种操作。
关系操作的特点是集合操作,即操作的对象和结果都是集合。
6.4表的完整性
数据库表的完整性是对关系的某种约束条件,也就是说关系的值随着时间的变化时应该满足的一些约束条件。
7.范式
7.1 第一范式
只要表中不再含有其他的表,就说明了符合第一范式
7.2下面表存在的问题
- 数据冗余:每个系班主任名字重复出现,而且重复次数和所有学生的所有课程成绩出现次数一样。
- 更新异常
- 插入异常
- 删除异常
参考文献
[1] https://blog.csdn.net/a1034386099/article/details/88635232