多表设计的目的就是为了消除冗余的数据,将一张表拆分成为多张表,或者将多张表中的共同数据提取到一张表中.
举个例子,有如下两张表
编号 | 姓名 | 民族 | 国籍 |
---|---|---|---|
1 | 张三 | 汉族 | 中国 |
2 | 李四 | 汉族 | 中国 |
编号 | 省份 | 国籍 |
---|---|---|
1 | 陕西 | 中国 |
2 | 广州 | 中国 |
这两张表中就存在着大量的冗余,如民族,国籍,若是我们对其进行多表设计就可以变为
民族表
民族编号 | 民族 |
---|---|
1 | 汉族 |
2 | 回族 |
国家表
国家编号 | 国籍 |
---|---|
1 | 中国 |
2 | 巴基斯坦 |
而最上面的两张表就可以变为
编号 | 姓名 | 民族编号 | 国家编号 |
---|---|---|---|
1 | 张三 | 1 | 1 |
2 | 李四 | 1 | 1 |
编号 | 省份 | 国家编号 |
---|---|---|
1 | 西安 | 1 |
1 | 广州 | 1 |
通过这样的方法我们可以将重复的冗余数据消除掉,并且可以做到对一个数据重复利用.
1.为了建立冗余较小, 结构合理的数据库,设计数据库时必须遵循一定的规则, 在关系型数据库中这种规则也被称作时范式. 范式是符合某一种设计要求的总结.
2.在目前关系型数据库中有6种范式:
(1)第一范式(1NF);
(2)第二范式(2NF);
(3)第三范式(3NF);
(4)巴斯-科德范式(BCNF);
(5)第四范式(4NF);
(6)第五范式(5NF), 又称完美范式.
3.满足最低要求的范式是第一范式(1NF), 在第一范式的基础上进一步满足更多的规范要求就被称为第二范式(2NF), 其余范式依次类推. 一般来说, 数据库只需要第三范式(3NF)就行了.
第一范式是最基本的范式, 要确保数据库表中的每一列都保持原子性, 如果数据库表中的所有字段值都是不可分解的原子值, 就说明该数据库表满足了第一范式.
举个例子
编号 | 姓名 | 联系方式 |
---|---|---|
1 | 王麻子 | 邮箱/电话/qq |
满足第一范式后的表结构
编号 | 姓名 | 邮箱 | 电话 | |
---|---|---|---|---|
1 | 王麻子 | [email protected] | 1313131 | 2212321 |
1.第二范式就是要有主键, 要求其他字段都依赖于主键;
2.没有主键就没有唯一性,没有唯一性在集合中就定位不到这行记录, 所以要主键.
3.其他字段为什么要依赖于主键? 因为不依赖于主键, 就找不到他们. 更重要的是, 其他字段组成的这行记录和主键表达的是同一个东西, 而主键是唯一的, 它们只需要依赖于主键,也就成了唯一的.
第三范式就是要消除传递依赖, 方便理解, 可以看做是"消除冗余".
订单编号 | 数量 | 商品编号 | 商品名称 | 单价 | 订单金额 |
---|---|---|---|---|---|
1000 | 2 | 2020 | 手机 | 2000 | 4000 |
商品编号 | 商品名称 | 单价 |
---|---|---|
2020 | 手机 | 2000 |
订单编号 | 数量 | 订单金额 | 商品编号 |
---|---|---|---|
1000 | 2 | 4000 | 2020 |
一般来说, 数据库只需要第三范式(3NF)就行了.
学生表:姓名,性别,手机号,年级编号,注册时间
年级表:年级编号,年级名称,年级介绍
课程表:课程编号,课程名称,课程介绍
表与表之间的几种关系:
1.一对一关联;
2.一对多关联;
3.多对一关联;
4.多对多关联.
-- 创建年级表
CREATE TABLE t_grade(
g_id INT PRIMARY KEY AUTO_INCREMENT COMMENT'年级编号',
g_name VARCHAR(10) COMMENT'年级名称',
g_desc VARCHAR(50) COMMENT'年级介绍'
)
-- 创建学生表
CREATE TABLE t_stu(
s_id INT PRIMARY KEY AUTO_INCREMENT COMMENT'学号',
s_name VARCHAR(10) COMMENT'姓名',
s_sex CHAR(1) DEFAULT'男' COMMENT'性别',
s_phone INT(11) COMMENT'电话',
s_g_id INT COMMENT'年级编号',
reg_time DATETIME COMMENT'注册时间'
)
介绍一下弱关联关系: 表结构本质上没有联系,表与表之间的关系是人为定义的,删除关联表中的数据对另一个没影响, 如上图的年级编号和年级表是一种弱关联关系.
再说一下强关联关系, 给外键添加约束,强制让外键与对应的主键产生关联关系(外键,对应的都是另一个表中的主键)
1.外键: 引用另外一个数据表的某条记录.
2.外键列的数据类型应于主键列保持一致.
3.数据表之间的关联/引用关系是依靠具体的主键(primary key)和外键(foreign key)建立起来的.
建表时添加外键的语法:
create table 表名(
constraint 约束名 foreign key(外键列) references 主键表(主键列)
)
添加外键约束语法:
alter table 表名
add [constraint 约束名(自己起的)]
foreign key(外键列)
references 关联表(主键)
删除外键语法:
alter table 表名 drop foreign key 外键约束名;
为上表添加外键
ALTER TABLE t_stu
ADD CONSTRAINT s_foreign_key
FOREIGN KEY(s_g_id)
REFERENCES t_grade(g_id);
-- 创建课程表,多对多关系,一个学生对应多个课程,一个课程对应多个学生
CREATE TABLE t_course(
c_id INT PRIMARY KEY AUTO_INCREMENT COMMENT'课程号',
c_name VARCHAR(10) COMMENT'课程名',
c_desc VARCHAR(20) COMMENT'课程介绍'
)
-- 设计关系表来存储多个数据之间的关系
CREATE TABLE t_stu_course(
sc_id INT PRIMARY KEY AUTO_INCREMENT,
sc_stu_id INT,
sc_course_id INT,
CONSTRAINT stu_id_fk FOREIGN KEY(sc_stu_id) REFERENCES t_stu(s_id),
CONSTRAINT cou_id_fk FOREIGN KEY(sc_course_id) REFERENCES t_course(c_id)
)
1.当主表中没有对应的记录时,不能将记录添加到从表
2.不能更改主表中的值而导致从表中的记录孤立
3.从表存在与主表对应的记录,不能从主表中删除该行
4.删除主表前,先删除从表
1.关联查询又称为多表查询, 当查询的字段来自于多个表时, 就会用到连接查询
2.笛卡尔乘积现象: 表1有m行, 表2有n行, 查询结果有m*n行
(1)发生原因: 没有有效的连接条件
(2)如何避免: 添加有效的连接条件
把满足条件的两张表中的交集数据查询出来
语法:
select 结果 from 表1,表2 where 表1.列1=表2.列2
SELECT s_id,s_name,s_sex,s_g_id,g_name,g_id
FROM t_stu,t_grade
WHERE s_g_id = g_id
1.等值连接
#等值连接
/*
语法
select 结果 from 表名 inner join 被连接的表名(外键表) on 外键=主键
*/
SELECT *
FROM t_stu
INNER JOIN t_grade ON s_g_id = g_id
2.非等值连接
#创建一个等级表
CREATE TABLE t_level(
l_name CHAR(1),
l_min_score INT,
l_max_score INT
)
/*
非等值连接
语法
select 结果
from 表1
inner join 表2
on 表1.列1 between 表2.列2 and 表2.列3
*/
SELECT
s_name,
l_name
FROM
t_stu
INNER JOIN t_level
ON s_score BETWEEN l_min_score
AND l_max_score
3.自连接: 在一张表中建立连接关系
CREATE TABLE t_area(
a_id INT,
a_name VARCHAR(10),
a_father INT
)
#在一张表中建立连接关系
SELECT
t1.a_name,
t2.a_name
FROM
t_area t1
INNER JOIN t_area t2
ON t1.a_father = t2.a_id;
1.左外连接(left join)
/*
语法
select 结果
from 表1
left join 表2
on 表1.字段=表2.字段l;
不管表1的字段与表2的字段是否有连接,都会显示表1的所有信息
*/
SELECT *
FROM t_stu s
LEFT JOIN t_grade g
ON s.s_g_id = g.g_id;
2.右外连接(right join)
/*
语法
select 结果
from 表1
right join 表2
on 表1.字段1=表2.字段2;
不管表1有没有和表2中的所有数据关联,都会显示出表2的所有
*/
SELECT *
FROM t_stu s
RIGHT JOIN t_grade g
ON s.s_g_id = g.g_id;
-- 交叉连接 类似于内连接
SELECT *
FROM t_stu s
CROSS JOIN t_grade g
ON s.s_g_id = g.g_id;
DPDK通过使用巨页分配,内存需要较少的页面,减少对TLB访问的miss,缩短了虚拟地址到物理地址的重定位的转换时间,因此提高了性能。巨页通常来说是2MB一个页,而不使用巨页的普通页一般是4KB,差距是明显的。f代表0xf也就是四个二进制1,使用前4个逻辑核,ff则代表使用8个逻辑核。巨页的分配在每次开机之后都要立即进行一次,以防止内存在物理内存上已经被碎片化。编译好DPDK后,意味着你得到了应用程序所需要的依赖库。793599096 免费获取,或自行报名学习,免费订阅,永久学习,关注我持续更新哦!....
一、安装库和导包pip install pymongofrom pymongo import MongoClient二、连接服务器端口号 27017连接MongoDB连接MongoDB我们需要使用PyMongo库里面的MongoClient,一般来说传入MongoDB的IP及端口即可,第一个参数为地址host,第二个参数为端口port,端口如果不传默认是27017。 conn ...
list容器的迭代器不能像vector那样随机访问(直接加上数字就能定位到目标位置),但是要定位到指定的位置其实不需要我们自己编写函数来自增迭代器,STL库给我们提供了现成的方法,那就是调用advance函数auto iter = begin(data);std::advance(iter, 9); // Increase iter by 9data.insert(iter, 3, 88);...
OpenCV4:人体姿态检测参考:Python+OpenCV+OpenPose实现人体姿态估计(人体关键点检测)应用opencv的神经网络模块加载关键点检测网络进行人体的关键点检测。值得注意的是openpose检测关键点速度很慢,无法做到实时检测,更不要说在移动设备上运行了。实现原理图片来自参考博客两个分支最后得到的是关节置信度分布图和关节亲和度分布图(个人理解)实现神经网络图片来自参考博客前十层为VGG19的前十层,进行特征提取。后面分为两个分支:第一个分支得到的是人体各个关节的
目录:点击下面的文字自动跳转到对应的目录下File(文件)API文件流字节流:传输单位为字节用于传输 图片、视频、音乐 等二进制文件FileReader输入和FileWriter输出字符流:下载网络资源:转换流:对象流:打印流PrintStream
本篇文章将介绍编写一个css文件的方法及步骤,感兴趣的可以参考一下。如何写css文件?1、新建文本文档,重命名为 xxx.css2、使用编辑器打开文件,第一行写上编码格式@charset "utf-8";3、接下来编写你需要的css代码,格式为选择器 {属性名1: 属性值1,属性名2: 属性值2,...}例如:(推荐学习:CSS视频教程)@charset "utf-8";body{margin: ...
1、角色模型制作 unity3d支持Skin动画 但是不支持Physique动画 会发现Physique动画在unity里严重变形 因此在模型的骨骼动画的制作上面 要用Skin 当然也可以做成Physique 然后用插件转换一下 3dsmax的插件PhyToSkin 3dsmax中转换之前 为了避免出错 先隐藏骨骼 然后对绑定了骨骼
本小节内容不多,但是个人感觉比较独立,还是拿出来单讲吧。在开发 IntelliJ Plugin 时,如果需要用到 Gson、OKHttp 等第三方库时,该怎么办呢?回答这个问题前,我先补充前面没有讲到的内容。插件开发其实可以使用两种方式,官方文档:http://www.jetbrains.org/intellij/sdk/docs/tutorials/build_system.html...
学习一下一:c++静态成员(static)1.为什么使用静态成员来实现同一类的对象之间的数据共享 (1)全局变量:安全隐患、违背OOP“数据隐藏”的原则 (2)一般的数据成员:有数据冗余,浪费空间 (3)静态成员:本类的所有对象共同拥有一个存储“总数”的数据成员2.静态数据成员的特点 (1)静态数据成员为本类所有对象共有,是“类属性”而非“实例属性” 不专属于任一对象,为所有对象共享 (2)静态数据成员单独存储并只存储一份 ...
一、NmapNmap 是一种常用工具,可用于判定网络的布局。我们可以在网络上使用 Nmap 来查找主机系统以及打开这些系统的端口。 1. 安装Nmap。[[email protected] ~]# yum -y install nmap1使用示例(最简单的使用方法就是nmap 域名或ip):[[email protected] ~]# nmap 10.8.34.1Starting Nmap 6.40 (...
H.264是MPEG4的第十部分,是一个标准。 对头,国际上两个视频专家组(VCEG和MPEG)合作提出的标准,两个专家组各有各的叫法,所以既叫H.264,也叫AVC。x264是一个编码器,他参照的标准是H.264。 对头,H.264是需要付费的编码格式,而x264是符合H.264标准的一个开源项目,是免费的,也就是H264的一个简化版,不支持某些高级特性。但x264非常优秀,并不比H264的
目录1.简介1.1安装使用1.2组成1.3发展2.IOC(重点)2.1问题产生2.2解决方式3.使用ioc创建对象3.1无参构造3.2有参构造3.2.1下标赋值3.2.2类型赋值3.2.3参数名赋值3.3总结4.Spring的配置4.1 bean4.2 alias4.3 import5.依赖注入(DI)5.1 构造器注入5.2使用Set注入5.3拓展注入5.3.1 P命名空间注入5.3.2...