以前上学,教数据库相关的课程的时候,都会教怎样使用外键,但是实际工作了这么多年,几乎在数据库中很少用到外键,这似乎都已经被遗忘了。为什么学习知识在工作中又很少用到呢,数据库设计方面为什么大家都
不怎么使用外键呢。
首先说下什么是外键。
举例来说用户表id,name。用户文章表,文章id,文章name,用户id。对于文章表来说,用户id就是外键。
看下外键的定义:
第一张表用户表
CREATETABLE`users`(
`id`bigint(20)unsignedNOTNULLAUTO_INCREMENTCOMMENT'用户id',
`name`varchar(256)NOTNULLCOMMENT'用户名称',
PRIMARYKEY(`id`)
)ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COMMENT='用户表';
第二张表
CREATETABLE`order`(
`id`bigint(20)unsignedNOTNULLAUTO_INCREMENTCOMMENT'文章id',
`user_id`bigint(20)unsignedNOTNULLCOMMENT'用户id',
PRIMARYKEY(`id`),
KEY`user_id`(`user_id`),
FOREIGNKEY(`user_id`)REFERENCES`users`(`id`)
)ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COMMENT='文章表';
两张表,我们使用了FOREIGNKEY来定义外键
这时
1.如果文章表插入数据时,用户id的值必须是已存在于用户表中
2.如果要删除用户id=1的数据,需要先删除文章表中user_id=1的数据,否则就会报错
这样就保障了数据的一致性
在回过头来说说为什么很少在实际开发中使用外键呢,这保障了数据的一致性,难道不香吗。
我们来看看一些主流的说法,对于外键的使用还是有弊端的。
1,性能问题
每次更新表时,都需要额外查询外键的表是否有对应数据,这是必须要去判断的,如果这个事由程序去控制,就可操作性比较灵活。
2,并发问题
每次修改数据时都需要检查另一个表的数据,这样获取到额外的锁,若是在高并发大流量的应用中,很容易造成死锁。
说了这么些外键的优缺点,话说大家在开发中用外键用的多吗?
版权声明:本站所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流,不声明或保证其内容的正确性,如发现本站有涉嫌抄袭侵权/违法违规的内容。请举报,一经查实,本站将立刻删除。