发表于: 2019-12-15 20:45:36
2 801
一、今天完成的事情:
1.任务11验收标准1--知道数据库表的规范--https://blog.csdn.net/zollty/article/details/85165434
Ⅰ:命名规范
1)总命名规范
a.不得使用数据库保留关键字,以及php或者java等常用语言的保留关键字,或者可能成为关键字的单词作为完整命名。(对一些疑似关键字的单词,可以在后面加一个下划线来避免,比如key_)。Mysql保留关键字列表:--https://dev.mysql.com/doc/refman/5.7/en/keywords.html
b.如无特殊说明,名称必须用英文字母开头,采用有特征含义的单词或缩写,单词间用“_”分割,且只能由英文字母、数字、下划线组成,不能用双引号包含。
c.除了数据库名称长度为1-8个字符,其余(包括表、字段、索引等)不超过30个字符,Database link名称也不要超过30个字符。(30不是凭空想象的,参考了oracle的限制)
2)表名
建议以2-3字项目名称为前缀开头,紧跟2-5个字符(英文或数字,但不能全是数字)的模块名(必须),最后跟上当前表的含义的单词(1-3个单词,用下划线连接),例如:JNS_Login_user。
3)字段名
a.表的字段数不超过50个。
b.类型:各表之间相同含义的字段,类型定义要完全相同。
c.命名:①字段名无单词数的限制,但是名字的字符长度应该符合上面的“总命名规范”。
②字段命名及其注释,要做到清楚、无歧义。
③同一个字段名在一个数据库中只能代表一个意思。
④反之,代表同一个意思的字段,在各表中都用相同的单词表示。
⑤对于多个表关联的外键字段,例如create_user_id,关联的是user表里面的id字段,建议的命名规则是“关联表名(无需前缀)+ _ + 关联字段名”。
4)主键名
前缀为PK_。以PK_+表名+主键字段名构成。如果复合主键的构成字段较多,则只包含第一个字段。表名可以去掉前缀。如PK_SYS_CAR_ID
5)外键名
前缀为FK_。以FK_+外键表名+主键表名+外键字段名构成。表名可以去掉前缀,如FK_SYS_USR_SYS_CAR_ID
6)普通索引
前缀为IDX_。以IDX_+表名+索引字段名构成。如果复合索引的构成字段太多,则只包含第一个字段,并添加序号。如IDX_SYS_CAR_DIN
7)主键索引
前缀为IDX_PK_。以IDX_PK_+表名+索引字段名构成。表名可以去掉前缀。如IDX_FK_SYS_CAR_ID。
8)唯一索引
前缀为IDX_UK_。以IDX_UK_+表名+索引字段名构成。表名可以去掉前缀。如IDX_UK_SYS_CAR_DIN。
9)外键索引
前缀为IDX_FK_。以IDX_FK_+表名+外键字段名构成。表名可以去掉前缀。例如IDX_FK_SYS_CAR_ID。
10)Oracle序列
前缀为SEQ_。以SEQ+“序列业务名称”构成。如果“序列业务名称”就是某个表名,则使用表的全名,不可去掉前缀。如SEQ_SQ_SYS_CAR。
Ⅱ:表设计规范
1)采用UTF8字符集。
2)对于数据量可能很大的表,采用分库/分表/分区表,横向拆分控制单表容量。
3)必须为表、字段等添加注释
4)遵守数据库的设计规范3NF规定。
a.表内的每一个记录都只能被表达一次。
b.表内的每一个记录都应该被唯一的 标识(有唯一键)。
c.表内不应该存储依赖于其他键的非键信息。
5)mysql:
a.使用InnoDB存储引擎。
b.数据库和表字符集类型统一,排序规则统一;建表语句中强制指定字符集。
c.自增字段必须是整数类型,使用BIGINT类型。并且自增字段必须是主键或者主键的一部分。
Ⅲ:字段设计规范
1)凡是可能被索引的字段必须定义为NOT NULL,可以设置为default值;
2)非负值的数字统一使用unsigned的(无符号)类型存储。
3)大对象字段
mysql:尽量不要使用TEXT类型保存,mysql的varchar类型支持65535字节,满足大多数场景,仅当字符数特别大时,才考虑TEXT类型。
4)禁止使用enum,对于Boolean类型或者表示简单状态的字段,Mysql用tinyint,Oracle用NUMBER(1)
5)数字、小数类型
6)时间类型标准
Mysql:存储年使用Year,存储日期使用Date,使用精确时间戳(精确到秒)尽量使用timestamp类型。因为timestamp使用4字节,而datetime使用8字节。
7)必须使用int unsigned存储IPV4
8)一些常见字段的统一
Ⅳ:索引规范
复合索引的数量不要超过5个。
单表的索引的数量在5个以内。
不建议在低基数上创建索引,例如性别列
长文本字段不能使用索引
Ⅴ:其他
主键ID,建议使用分布式全局唯一递增ID。
2.任务11验收标准2--会增删改查一条或多条信息和字段
增:insert into 表名 (字段1,字段2)values(值1,值2),(值11,值22)
删:Delete from 表名 where 字段1 in(值1,值2)
改:Update 表名 set 字段1=值1 where 字段2=值2
查:Select * from 表名 where 字段1=值1
3.任务11验收标准3--明白表和视图的关系--https://zhidao.baidu.com/question/547083057.html
联系:视图(View)是在基本表上建立的表,它的结构(即所定义的列)和内容(即所有数据行)都来自于基本表,它依据基本表而存在,一个视图可以对应一个基本表,也可以对应多个基本表。视图是基本表的抽象和在逻辑意义上建立的新关系。
区别:
1)视图是已经编译好的SQL语句,而表不是
2)视图没有实际的物理记录,而表有
3)表是内容,视图是窗口
4)表只是物理空间而视图不占用物理空间,视图只是逻辑概念的存在,表可以及时对它进行修改,但视图只能由创建的语句修改
5)表是内模式,视图是外模式
6)视图是查看数据的一种方法,可以查询数据中某些字段构成的数据,只是一些SQL语句的集合。从安全的角度说,视图可以不给用户接触数据表,从而不知道表结构
7)表属于全局模式中的表,是实表;视图属于局部模式的表,是虚表。
8)视图的建立和删除只影响视图本身,不影响对应的基本表。
4.任务11深度思考1--如何同时增加1000条数据--https://blog.csdn.net/qq_24613517/article/details/80526735
1)InnoDB存储引擎
2)MyISAM存储引擎
3)insert into table_name Values(),()......
5.任务11深度思考2--有两个表的情况怎么连在一起查询--https://blog.csdn.net/u012999796/article/details/62232575
联合查询
1)联合查询分类
a.内连接(inner join或join):仅显示两个表中匹配行,即两表都有才显示。(三表时,可以理解为将其中两个表的结果作为一张表去和第三张表内连接)
b.外连接(outer join):
左外连接(Left outer join或left join):左表有就显示,不论右表
右外连接(Right outer join或right join):右表有就显示,不论左表
全外连接(full outer join或full join):左表/右表,有一个就显示(Mysql中不支持全外连接,但可以通过Union来实现)
c.交叉连接(cross join):交叉连接是对A、B量表进行笛卡尔积的结果查询出来。即A的每条记录都和B中的所有记录相对应的信息。
d.结果集连接(union或union all):SQL Union用于将多个select结果集进行合并。值得注意的是,UNION内部的SELECT语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条SELECT语句中的列和顺序必须相同。
6.任务11深度思考3--在数据库中查询语句速度很慢,如何优化?--https://blog.csdn.net/java958199586/article/details/7099204
1)建索引
a.提高查询检索的性能
b.创建唯一索引
c.创建主键
d.归类
2)减少表之间的关联
3)优化sql,尽量让sql很快定位数据,不要让sql做全表查询,应该走索引,把数据量大的表排在前面。
4)简化查询字段,没用的字段不要,以及对返回结果的控制,尽量少返回数据。
7.任务11深度思考4--数据库的种类有哪些?--https://baike.baidu.com/item/%E6%95%B0%E6%8D%AE%E5%BA%93/103728?fr=aladdin#2
1)关系型数据库。如Mysql,SQL server,oracle等。针对结构化数据使用关系型数据库更优。关系型数据库十分注意数据操作的事务性、一致性。
2)非关系型数据库(NoSQL)。随着这些年技术方向的不断发展,大量的Nosql数据库如MongoDB、redis、Memcache出于简化数据库结构、避免冗余、影响性能的表连接、摒弃复杂分布式的目的被设计。指的是分布式的、非关系型的、不保证遵循ACID原则的数据存储系统。
Nosql数据库适合追求速度和可扩展性、业务多变的应用场景。对于非结构化的处理更加合适,如文章、评论,这些数据如全文搜索、机器学习通常只用于模糊处理,并不需要像结构化数据一样,需要精确查询,而且这类数据的规模往往是海量的,数据规模的增长往往也是不可预期的,而Nosql的扩展能力也几乎是无限的,所以Nosql数据库可以很好的满足这类数据的存储。Nosql数据库利用key-value可以大量的获取大量非结构化数据,并且数据的获取效率很高,但用它查询结构化数据效果就比较差。
目前Nosql数据库仍然没有统一的标准,它现在有四大种类:
a.键值对存储(key-value):代表软件Redis,它的优点能够进行数据的快速查询,而缺点就是需要存储数据之间的关系。
b.列存储:代表软件Hbase,它的优点是对数据能快速查询,数据存储的扩展性强。而缺点就是数据库的功能有局限性。
c.文档数据库存储:代表软件MongoDB,它的优点是对数据结构要求不特别的严格。而缺点是查询性的性能不好,同时缺少一种统一查询语言。
d.图形数据库存储:代表软件InfoGrid,它的优点可以方便利用图结构相关算法进行计算。而缺点是想得到结果必须进行整个图的计算,而且遇到不合适的数据模型时,图形数据库很难使用。
3)分布式数据库:
所谓分布式数据库技术,就是结合了数据库技术与分布式技术的一种结合。数据库独立性概念在分布式数据库管理系统中同样是十分重要的一环,但是不仅如此,分布式数据管理系统还增加了一个叫分布式透明性的新概念。这个新概念的作用是让数据进行转移时使程序正确性不受影响,就像数据并没有在编写程序时被分布一样。
二、明天计划的事情:
1.开始任务12
三、遇到的问题:
1.sql中的笛卡尔积是什么?--https://blog.csdn.net/qq_22222499/article/details/81517559
1)select * from tablea,tableb where tablea.id=tableb.id 这句sql是有问题的,执行select * from tablea,tableb这句sql就会发现出现的结果是tablea的每个记录和tableb的所有记录都生成一条记录。比如,tablea有四条数据,tableb有五条数据,最后会生成20条记录。回到开头的sql,再用where条件去过滤内容,很多人觉得没啥问题,这个问题在数据量不大的时候确实没问题。但是如果tablea有1万条数据,tableb有一万条数据,这样就会产生1亿条数据,再用where条件去过滤,大大降低了性能。
2)既然会产生这个问题,那么如何避免呢?当然是join on,select * from tablea join tableb on tablea.id=tableb.id。这样执行时会按照on中的条件,来连接两条数据,大大减少了需要排除的数据,然后可以在where条件中去过滤。
四、收获:
1.了解数据库的设计规范、视图、联合查询、分类。
2.了解如何优化数据库。
评论