• 我知道了嗯 置顶
    2019-06-19
    外键多了会有很多维护问题吧?

    作者回复: 是否使用外键确实会有一些争议。我来解释下关于外键的使用:
    首先,外键本身是为了实现强一致性,所以如果需要正确性>性能的话,还是建议使用外键,它可以让我们在数据库的层面保证数据的完整性和一致性。
    当然不用外键,你也可以在业务层进行实现。不过,这样做也同样存在一定的风险,因为这样,就会让业务逻辑会与数据具备一定的耦合性。也就是业务逻辑和数据必须同时修改。而且在工作中,业务层可能会经常发生变化。

    当然,很多互联网的公司,尤其是超大型的数据应用场景,大量的插入,更新和删除在外键的约束下会降低性能,同时数据库在水平拆分和分库的情况下,数据库端也做不到执行外键约束。另外,在高并发的情况下,外键的存在也会造成额外的开销。因为每次更新数据,都需要检查另外一张表的数据,也容易造成死锁。
    所以在这种情况下,尤其是大型项目中后期,可以采用业务层来实现,取消外键提高效率。
    不过在SQL学习之初,包括在系统最初设计的时候,还是建议你采用规范的数据库设计,也就是采用外键来对数据表进行约束。因为这样可以建立一个强一致性,可靠性高的数据库结构,也不需要在业务层来实现过多的检查。
    当然在项目后期,业务量增大的情况下,你需要更多考虑到数据库性能问题,可以取消外键的约束,转移到业务层来实现。而且在大型互联网项目中,考虑到分库分表的情况,也会降低外键的使用。
    不过在SQL学习,以及项目早期,还是建议你使用外键。在项目后期,你可以分析有哪些外键造成了过多的性能消耗。一般遵循2/8原则,会有20%的外键造成80%的资源效率,你可以只把这20%的外键进行开放,采用业务层逻辑来进行实现,当然你需要保证业务层的实现没有错误。不同阶段,考虑的问题不同。当用户和业务量增大的时候,对于大型互联网应用,也会通过减少外键的使用,来减低死锁发生的概率,提高并发处理能力。

     9
     128
  • 梁😜
    2019-06-22
    在阿里巴巴《JAVA开发手册》中有这么一条
    “【强制】不得使用外键与级联,一切外键概念必须在应用层解决。”,说明指出
    “外键与级 联更新适用于单机低并发,不适合分布式、高并发集群;级联更新是强阻塞,存在数据库更新风暴的风 险;外键影响数据库的插入速度。”
    老师对此怎么看呢?
     5
     22
  • KaitoShy
    2019-06-19
    主键:唯一标识一条记录,不能重复,不能为空。
    外键:确保了表于表之间引用的完整性,可以重复,可以为空
    索引:提升数据检索速度
    区别:主键是索引的一种,而且是唯一索引的一种。而并非在是索引,是两表之间的链接

    疑问:1. 关于使用主键和外键越多越好有个疑问,是否涉及到数据库的维护成本,性能等问题呢?而我们现实生活中很少到外键约束,基本上用程序维持这种关系的。
    2. 设计原则和之前了解的“数据库设计的三大范式”有什么关系呢?个人感觉是从不同纬度讲述了设计的方法,三大范式过于理论化,而老师的更具有实操性。不过还是希望老师,讲解一下。
    展开
    
     18
  • 夜路破晓
    2019-06-19
    类比自己,
    主键就好比是我的身份证;
    外键就好比我在各种团队组织中的身份,如在单位是员工和管理者、在家是儿子和丈夫、在协会是会员和委员等;
    索引就好比是我的某些特征或者独树一帜的风格,玉树临风、风流倜傥之类的。

    作者回复: 可以这么理解,这么说也比较有趣。在数据库系统中实现他们会采用一些技术方式。比如索引,常用的算法有BTree何Hash索引,是一种数据结构来实现快速检索的目的。

    
     18
  • pepezzzz
    2019-06-19
    外键怎么会越多越好呢? 现在的数模设计都是不用外键,会带来数据归档和数据操作等一系列问题。
    
     13
  • 夜路破晓
    2019-06-19
    修改字段数据类型,报错,改写成:
    ALTER TABLE player MODIFY column player_age float(3,1)

    作者回复: 对的

     1
     9
  • Ant
    2019-06-19
    老师您好,mysql的编码utf-8是3个字节的,它和我们传统的utf-8编码是不一样的,mysql中不是用了utf-8mb4莱对应4字节的utf-8编码吗?我在项目中一般都会用utf-8mb4这种,请问下这两个在生产环境如何做选择呢?
     4
     9
  • kyle
    2019-06-19
    外键越多越好吗?应该是维护麻烦的缘故,我们都没使用外键了!
    
     6
  • o灬o
    2019-06-20
    银行业的数据库基本不用自增长的主键,不利于维护,基本上都是使用唯一标识字段uuid+日期+渠道流水(unique index)来保证数据的唯一性;老师您的这种方法很适合初学者和复习者。
    
     5
  • 木偶人King
    2019-06-20
    老师咱们这里
    ALTER TABLE player RENAME COLUMN age to player_age
    在mysql中报错。mysql中修改列名属性 用change或者modify 吧。
    修改表名用rename to.
     2
     4
  • allean
    2019-06-19
    实际生产环境,更多的是用一个冗余字段取代外键吧?

    作者回复: 分情况而定,如果外键或者这些属性字段不需要修改的话,可以使用冗余字段替代,达到通过“空间换时间”的效果
    所以呢,如果冗余字段可控好维护,可以使用。如果涉及到级联删除/级联更新,冗余字段不可控,建议还是采用外键的方式。

    
     4
  • 阡陌
    2019-06-19
    可是实际工作的时候更多的外键确实增大了维护难度。对于老师说的外键越多越好表示难以理解。老师可否细讲一下
    
     4
  • chengzise
    2019-06-19
    我的理解:
    主键:确保本表每行数据的唯一性
    外键:与外表建立连接
    索引:加快本表数据的查找

    作者回复: 对的

    
     4
  • nzdx
    2019-07-20
    MySQL8.0.16版本及以上才支持check,以前的版本解析后就忽略了,不起作用
    
     3
  • 风中花
    2019-06-19
    老师好!可不可以说下外键和冗余一个字段的不同!有时候是可以到达一样的效果!我早期使用orcal数据哪会全是外键设计!我记得做数据很麻烦和插入数据也有困惑!那时的感觉!也许就是老师说的数据强一致的作用效果!现在大多数关系关联全是冗余字段!其实我一直没有明白真正的差异和区别!望老师能解惑!谢谢
    
     2
  • ABC
    2019-06-19
    我的理解:


    主键:用来在表中确定一条数据,唯一且不可为空;

    外键:用来关联两个表的数据,对删除有约束,可以防止误删除数据(在实际删除时,也需要先删除外键关联的数据才能删除当前表的数据)。外键可以为空。

    索引:用来加快查询的速度,有唯一索引和普通索引。

    区别:

    主键:确定唯一性,增删改的时候都会用到;查询单条记录的时候会用到,不可为空;

    外键:查询和删除,修改,可为空;

    索引:查询,统计数据。
    展开
    
     2
  • 错过了过去
    2019-06-19
    ALTER TABLE student DROP COLUMN player_age;
    这里是 player 吧?

    作者回复: 对

    
     2
  • Sam
    2019-06-19
    主键,在一个表中唯一标记一行数据,作用等效于唯一约束+not null;在MySQL InnoDB引擎,数据表按照主键来组织表数据,形成索引组织表;在Oracle中,也有IOT表,但不显式指定创建索引组织表,那么数据表默认是堆表,主键上另外创建一个主键索引;
    外键,是指定两表之间的父子关系,子表外键上的数据,必须要在父表存在,在父表和子表的外键相关列上创建索引,会大大提高性能;
    索引,是提高查询效率的关键手段。索引是跟数据表相互独立的数据库对象,除非是Oracle中的索引组织表或者MySQL中的主键索引。索引的类型有B+树,hash,bitmap,全文索引等等。在表数据更新时需要维护索引结构,对DML效率有影响。
    
     2
  • taoist
    2019-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);
    展开
    
     1
  • supermouse
    2019-06-22
    主键是表中的记录的唯一标识,不能重复,不能为空,用来区分同一张表中不同的记录。一张表的外键是另一张表的主键,起到关联的作用,同时可以降低数据的冗余度,提高数据利用率。索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息,索引的一个主要目的就是加快检索表中数据。对于经常用来作为查询条件的字段,应该建立索引。但是对着数据量的增加,索引占用的空间也会越来越大
    
     1
我们在线,来聊聊吧