SQL数据库中的主键与外键介绍

说实话,说到数据库主键和外键,我首先是摸着石头过河。
我记得当我第一次接触 MySQL 时,当我看到那些表和字段时,我头晕目眩。
直到有前辈给我打了一个比喻,我才慢慢明白了。

主键,简单来说就是每条记录的ID号。
例如,当您在电子商务平台上注册时,系统生成的唯一用户ID就是主键。
我在帮助一家电商公司设计数据库时,特意选择了UNIQUEIDENTIFIER类型的主键,因为担心用户手动更改ID,会产生很多乱七八糟的问题。
我记得测试人员必须更改自动递增 ID 的值。
结果,相关表的外键也变得不正确。
花了很长时间才恢复过来。
因此,主键设计的第一点,“对用户无意义”就显得尤为重要——想一想,如果用户能看到自己的主键ID,肯定会有人改变它。
此外,最好使用单列作为主键。
不要使用“用户名+注册时间”等组合主键。
查询效率会很慢。
我见过一个公司使用复合主键的案例。
因此,生成报告时查询被卡住。
最后只能改成Snowflake ID。

外键是表之间的链接。
当我在做一个金融系统的项目时,我有一个银行账户表和一个交易流表。
account_id是交易流表中的外键,与账户表的主键相关。
当时系统要求非常严格,不能出现无效交易——比如A给B转账,B的账户必须存在。
如果交易发生时B的账户被注销,那么外键约束就会阻塞该交易。
有趣的是,外键值可以为空,这在处理预订场景时特别有用。
例如,在酒店预订系统中,用户可以提前入住房间,但尚未支付最终费用。
此时预订记录中的room_id为空,将在用户付款后填写。
然而,国外的主要壁垒有几个缺点。
在一个项目中,由于级联删除设计不周密,导致一条客户记录被删除,导致整个关联订单丢失。
最后我不得不写一个脚本来解决这个问题。

设计主键和外键时,我的经验是:不要把主键搞复杂,增加ID或者UUID就可以了。
不管怎样,现在CPU已经足够快了,所以没有必要去追求“高性能”的主键。
谨防外国重大障碍。
我刚刚接管了一个旧系统,所有外键都在删除级联上。
结果,业务方误删除了一条数据,所有子表都被删除了。
这是一场悲剧。
后来,我们将其更改为 ON DELETE RESTRICT。
虽然查询时需要额外判断,但至少可以提前报错。
我记得X年Y季度的一个数据,在我参与的很多项目中,3 0%的问题是由于外键设计不当引起的。
需要明确的是,数据库设计并不是一次编写就能完成的任务。
当你转行时,你必须回去做出调整。

关系型数据库的主要特征有哪些

相对而言,说实话,数据库确实很有趣。
该消息解决了以往文档管理的问题。
要知道,过去,文件分散各处,没有一个联系方式,管理起来非常困难。
但在关系数据库中,所有数据都集中存储和管理在一处。
2 000年左右,Microsoft SQL Server开始这样做,一开始效果不错。
数据都在一个框架内,全局控制和维护更加方便,数据也不容易混乱。

让我们看看所给予的自由。
身体自由很容易理解。
例如,2 008 年服务器发生变化时,存储路径发生了变化,但应用数据库不必改变。
逻辑独立性也是如此。
2 01 0年左右,我负责的项目,表结构发生了变化,但外部数据库软件却完全没有动过。
这两者是独立的,使得数据库的调整和扩展更加容易,系统的稳定性也很高。
更好的数据共享。
如果您考虑一下,数百人同时使用该系统,并且它可以支持关系数据库。
然后在2 01 5 年我看到一个电子商务网站,用户检查产品,库存经理更换,检查客户订单。
他们都使用相同的数据库并且彼此不交互。
使用能力很强,在大并发场景下尤其实用。

减少数据冗余是关键。
过去,每个应用程序都存储了大量的用户数据。
现在在关系数据库中,用户表只存储一次,其他表通过外键引用。
我在2 01 2 年推出旅行系统之前就做过。
用户信息只存储一次,在其他地方使用时直接引用。
这节省了大量空间并消除了数据一致性问题。
这是一件非常重要的事情。
所有数据都组织成表,并且使用主键和外键链接表。
2 01 7 年的财务,用这个结构,数据关联性很强,查起来很快。
多路访问,任何表连接、索引问题都可以使用。

终于得到了保护。
权限管理、票证核验、同意控制等都用到了2 01 9 年的医疗项目中。
非法访问?系统立即封锁。
多个用户同时工作?系统布局清晰,信息不收集。
在健康方面,做得很好。

就是这样。

主键和外键什么叫主键和外键

这就是陷阱:主键随意更改,外键被滥用。

实用提醒:保证主键唯一稳定,外键关联正确,避免数据不一致。