04丨使用DDL创建数据库&数据表时需要注意什么?
04丨使用DDL创建数据库&数据表时需要注意什么?
讲述:陈旸
时长11:11大小25.60M
DDL 的基础语法及设计工具
创建表结构
修改表结构
数据表的常见约束
设计数据表的原则
总结
赞 64
提建议
精选留言(122)
- 我知道了嗯置顶2019-06-19外键多了会有很多维护问题吧?
作者回复: 是否使用外键确实会有一些争议。我来解释下关于外键的使用: 首先,外键本身是为了实现强一致性,所以如果需要正确性>性能的话,还是建议使用外键,它可以让我们在数据库的层面保证数据的完整性和一致性。 当然不用外键,你也可以在业务层进行实现。不过,这样做也同样存在一定的风险,因为这样,就会让业务逻辑会与数据具备一定的耦合性。也就是业务逻辑和数据必须同时修改。而且在工作中,业务层可能会经常发生变化。 当然,很多互联网的公司,尤其是超大型的数据应用场景,大量的插入,更新和删除在外键的约束下会降低性能,同时数据库在水平拆分和分库的情况下,数据库端也做不到执行外键约束。另外,在高并发的情况下,外键的存在也会造成额外的开销。因为每次更新数据,都需要检查另外一张表的数据,也容易造成死锁。 所以在这种情况下,尤其是大型项目中后期,可以采用业务层来实现,取消外键提高效率。 不过在SQL学习之初,包括在系统最初设计的时候,还是建议你采用规范的数据库设计,也就是采用外键来对数据表进行约束。因为这样可以建立一个强一致性,可靠性高的数据库结构,也不需要在业务层来实现过多的检查。 当然在项目后期,业务量增大的情况下,你需要更多考虑到数据库性能问题,可以取消外键的约束,转移到业务层来实现。而且在大型互联网项目中,考虑到分库分表的情况,也会降低外键的使用。 不过在SQL学习,以及项目早期,还是建议你使用外键。在项目后期,你可以分析有哪些外键造成了过多的性能消耗。一般遵循2/8原则,会有20%的外键造成80%的资源效率,你可以只把这20%的外键进行开放,采用业务层逻辑来进行实现,当然你需要保证业务层的实现没有错误。不同阶段,考虑的问题不同。当用户和业务量增大的时候,对于大型互联网应用,也会通过减少外键的使用,来减低死锁发生的概率,提高并发处理能力。
共 14 条评论278 - 梁😜2019-06-22在阿里巴巴《JAVA开发手册》中有这么一条 “【强制】不得使用外键与级联,一切外键概念必须在应用层解决。”,说明指出 “外键与级 联更新适用于单机低并发,不适合分布式、高并发集群;级联更新是强阻塞,存在数据库更新风暴的风 险;外键影响数据库的插入速度。” 老师对此怎么看呢?共 5 条评论51
- 夜路破晓2019-06-19类比自己, 主键就好比是我的身份证; 外键就好比我在各种团队组织中的身份,如在单位是员工和管理者、在家是儿子和丈夫、在协会是会员和委员等; 索引就好比是我的某些特征或者独树一帜的风格,玉树临风、风流倜傥之类的。
作者回复: 可以这么理解,这么说也比较有趣。在数据库系统中实现他们会采用一些技术方式。比如索引,常用的算法有BTree何Hash索引,是一种数据结构来实现快速检索的目的。
共 2 条评论39 - KaitoShy2019-06-19主键:唯一标识一条记录,不能重复,不能为空。 外键:确保了表于表之间引用的完整性,可以重复,可以为空 索引:提升数据检索速度 区别:主键是索引的一种,而且是唯一索引的一种。而并非在是索引,是两表之间的链接 疑问:1. 关于使用主键和外键越多越好有个疑问,是否涉及到数据库的维护成本,性能等问题呢?而我们现实生活中很少到外键约束,基本上用程序维持这种关系的。 2. 设计原则和之前了解的“数据库设计的三大范式”有什么关系呢?个人感觉是从不同纬度讲述了设计的方法,三大范式过于理论化,而老师的更具有实操性。不过还是希望老师,讲解一下。展开25
- pepezzzz2019-06-19外键怎么会越多越好呢? 现在的数模设计都是不用外键,会带来数据归档和数据操作等一系列问题。共 1 条评论22
- 夜路破晓2019-06-19修改字段数据类型,报错,改写成: ALTER TABLE player MODIFY column player_age float(3,1)
作者回复: 对的
共 3 条评论20 - 马以2019-06-19老师您好,mysql的编码utf-8是3个字节的,它和我们传统的utf-8编码是不一样的,mysql中不是用了utf-8mb4莱对应4字节的utf-8编码吗?我在项目中一般都会用utf-8mb4这种,请问下这两个在生产环境如何做选择呢?共 5 条评论20
- nzdx2019-07-20MySQL8.0.16版本及以上才支持check,以前的版本解析后就忽略了,不起作用18
- o灬o2019-06-20银行业的数据库基本不用自增长的主键,不利于维护,基本上都是使用唯一标识字段uuid+日期+渠道流水(unique index)来保证数据的唯一性;老师您的这种方法很适合初学者和复习者。共 2 条评论16
- allean2019-06-19实际生产环境,更多的是用一个冗余字段取代外键吧?
作者回复: 分情况而定,如果外键或者这些属性字段不需要修改的话,可以使用冗余字段替代,达到通过“空间换时间”的效果 所以呢,如果冗余字段可控好维护,可以使用。如果涉及到级联删除/级联更新,冗余字段不可控,建议还是采用外键的方式。
11 - Danpier2019-07-10数据库管理工具墙裂推荐开源免费的 HeidiSQL(支持 MariaDB,MySQL,Microsoft SQL Server,PostgreSQL),运存占用低,很流畅,功能还全,Navicat 年费实在太贵了。
作者回复: HeidiSQL 不错
共 3 条评论10 - 木偶人King2019-06-20老师咱们这里 ALTER TABLE player RENAME COLUMN age to player_age 在mysql中报错。mysql中修改列名属性 用change或者modify 吧。 修改表名用rename to.共 3 条评论9
- kyle2019-06-19外键越多越好吗?应该是维护麻烦的缘故,我们都没使用外键了!9
- chengzise2019-06-19我的理解: 主键:确保本表每行数据的唯一性 外键:与外表建立连接 索引:加快本表数据的查找
作者回复: 对的
9 - leslie2019-08-25老师讲到navicat:不过其实可能忽略了一个问题;第三方工具的建表其实有时是有Bug的,字符集有时会并非如同设计的的一致;这个实际工作中有碰到过,一切看似OK,show create table就发现问题了。 其实mysql的建表语句应当去用Xshell之类的工具连到数据库创建:否则有时导出来的字符集就会与预期不一致,非原生态自己制作的数据库第三方工具都有类似问题;尤其一旦建表数目到数百张之后还是有一定比例有次问题。sql server的查询分析器是微软自己开发的才没有这问题。展开共 1 条评论7
- ABC2019-06-19我的理解: 主键:用来在表中确定一条数据,唯一且不可为空; 外键:用来关联两个表的数据,对删除有约束,可以防止误删除数据(在实际删除时,也需要先删除外键关联的数据才能删除当前表的数据)。外键可以为空。 索引:用来加快查询的速度,有唯一索引和普通索引。 区别: 主键:确定唯一性,增删改的时候都会用到;查询单条记录的时候会用到,不可为空; 外键:查询和删除,修改,可为空; 索引:查询,统计数据。展开6
- 阡陌2019-06-19可是实际工作的时候更多的外键确实增大了维护难度。对于老师说的外键越多越好表示难以理解。老师可否细讲一下6
- 丁丁历险记2020-06-01一般在业务层实现外键约束。学院派才喜欢瞎折腾什么外健,触发器,存储过程,还扯出一大堆好的理由出来。 而事实上工程的主要复杂度往往来源于变化以及规模。 所以各个子母块之间偶合越小越好。存储中间件就安心的做好自己存储的那一块即可。没有必要一个存储中间件天天操着业务如何处理的心6
- taoist2019-12-10# MariaDB 下执行下面语句 # 创建自增,须设为主键 CREATE TABLE player ( player_id int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, player_name varchar(255) NOT NULL); # 重命名字段 alter table player change column `age` player_age int(11); # 修改字段类型 alter table player change column `player_age` player_age float(3,1);展开5
- 番茄2019-08-07直接写这段,会报错哦 create table player ( player_id int(11) NOT NULL AUTO_INCREMENT, player_name varchar(255) NOT NULL ); 报错信息如下,所以是要设置主键吗: Incorrect table definition; there can be only one auto column and it must be defined as a key展开
作者回复: 对,如果是有自增列,这个自增列必须定义为键
共 2 条评论5