数据库建表,该不该使用外键?

  最近学习过程中,产生了一个疑问,到底该不该使用外键?

  不能自己瞎想,为此,去了知乎,搜索相关话题,总结出下面内容。


一:使用外键

优点:

(1)实现表与关联表之间的数据一致性;

(2)可以迅速的建立一个可靠性非常高的数据库结构,而不用让应用程序层去做过多的检查;

(3)可以提高系统鲁棒性、健壮性;

(4)可以实现开发人员和数据库设计人员的分工;

  缺点:

(1)数据库需要维护外键的内部管理;

(2)外键等于把数据的一致性事务实现,全部交给数据库服务器完成;

(3)有了外键,当做一些涉及外键字段的增,删,更新操作之后,需要触发相关操作去检查,而不得不消耗资源;

(4)外键还会因为需要请求对其他表内部加锁而容易出现死锁情况;

(5)容易出现数据库I/O的瓶颈;

二:不使用外键

优点:

(1)减少了数据库表与表之间各种关联的复杂性;

(2)牺牲应用服务器资源,换取数据库服务器的性能;

(3)将主动权把控在自己手里;

(4)去掉外键相当于优化数据库性能;

  缺点:

(1)所有外键的约束,需要自己在逻辑层自己实现;

(2)会出现数据错误覆写,错误数据进库的情况;

(3)消耗了服务器的性能;

(4)业务层里夹带持久层特性,耦合;

总结:

1. 互联网行业:不推荐使用外键。

    理由:1)用户量大,并发度高,为此数据库服务器很容易成为性能瓶颈,尤其受IO能力限制,且不能轻易地水平扩展;

       2)若是把数据一致性的控制放到事务中,即让应用服务器承担此部分的压力;

          3)应用服务器一般都是可以做到轻松地水平的伸缩;

  2. 传统行业:可以使用。

  理由:1)软件应用的人数有限,换句话说是可控的;

        2   数据库服务器的数据量也一般不会超大,且活跃数据有限;


相关链接:https://www.zhihu.com/question/19600081

原文地址:https://www.cnblogs.com/shadowdoor/p/9097361.html

时间: 2024-10-27 08:14:06

数据库建表,该不该使用外键?的相关文章

Mysql数据库,表,字符集,主外键等创建的sql模板

##如果存在同名的数据库,删除此同名的数据库. DROP DATABASE IF EXISTS cfms; ##如果不存在字符集为utf8的cfms这个数据库,那么就创建 CREATE DATABASE IF NOT EXISTS cfms CHARACTER SET utf8; ##第一次时表示使用此数据库 USE cfms; ##如果存在users这个表了,就删除重新创建 DROP TABLE IF EXISTS cfms.users;               ##如果存在要创建的数据库

(没写完)SQL数据库建表(基础大牛请飘过就好谢谢)

--SQL表与表之间的关系-- 首先要学会找表与表之间的关系 只有把表和表之间的关系找好才 可以键表,并方便查询. 一.表与表之间有三种关系 (1)两表之间的主键存在一对一的关系 随便在一表中加上另一表的主键为该表的外键. (2)两表之间的主键存在一对多的关系 在"一"表中创建"多"表的主键为"一"表的外键. (3)两表之间的主键存在多对多的关系 重新创建一个新表并加如两个表的主键为该表的外键. 再加上两表之间的关系属性. --        

数据库建表原则

关键字: 数据库建表原则 ·1. 原始单据与实体之间的关系 可以是一对一.一对多.多对多的关系.在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体.在特殊情况下,它们可能是一对多或多对一的关系,即一张原始单证对应多个实体,或多张原始单证对应一个实体.这里的实体可以理解为基本表.明确这种对应关系后,对我们设计录入界面大有好处. [例]:一份员工履历资料,在人力资源信息系统中,就对应三个基本表:员工基本情况表.社会关系表.工作简历表.这就是“一张原始单证对应多个实体”的典型例子.

Oracle数据库建表+添加数据练习

SQL脚本: 1 --建表 2 --student表+注释 3 create table student( 4 sno varchar2(3) not null, 5 sname varchar2(9) not null, 6 ssex varchar2(3) not null, 7 sbirthday date, 8 sclass varchar2(5), 9 constraint pk_student primary key(sno) 10 ); 11 comment on column s

字段自动递增的数据库建表的SQL写法

数据库建表的SQL写法如下: 数据库建表的SQL写法如下: create table dataC(  a int identity(1,2) primary key,  b varchar(20)) identity(1,2)中的1表示第一条记录的a的值,第二个参数表示递增的步长(本例中,表示步长为2) 在“查询分析器”中要插入数据,直接使用下面的插入方式,无须显示插入字段a的值 insert into dataC values('111')insert into dataC values('2

详细讲解提高数据库查询效率的实用方法、外键关于性能

1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from t where num=0 3.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放

MySQL 之 第二章: 库与表的基本操作; 数据类型; 完整性约束; 外键;

库与表的基本操作 数据类型 完整性约束 外键 库与表的基本操作 库的增删改查: 查看系统库语句: show databases; information_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息.列信息.权限信息.字符信息等performance_schema: MySQL 5.5开始新增一个数据库:主要用于收集数据库服务器性能参数,记录处理查询请求时发生的各种事件.锁等现象mysql: 授权库,主要存储系统用户的权限信息 sys: 创建数据库语法:

数据库的SQL语句创建和主外键删除操作

1 create table UserType 2 3 ( 4 5 Id int primary key identity(1,1), Name nvarchar(25) not null 6 7 ) go 1 create table UserInfo 2 3 ( 4 5 Id int primary key identity(1,1), LoginPwd varchar(50) not null, LoginName varchar(50) not null, Name varchar(25

表管理和索引,外键作用

表管理和索引,外键作用: 创建数据库create schema if not exists students character set 'gbk' collate 'gbk_chinese_ci'; cd students lsfile db.optcat db.optdefault-character-set=gbkdefault-collation=gbk_chinese_ci 修改数据库help alter database;help drop databases; help creat