数据库设计时,主表中有唯一业务编码字段,关联表还需要设计外键吗

2023-12-11 09:32:00 +08:00
 maitiantuzi

举个例子, 主表 - 物料表 material: id: 主键 ID code: 物料唯一编码 name: 物料名称

物料入库记录表: stock_in: id: 主键 ID material_id: 外键 - 物料 ID (这里需要吗?) mateiral_code: 物料唯一编码 in_date: 入库时间

3415 次点击
所在节点    数据库
32 条回复
abcdexx
2023-12-11 09:35:16 +08:00
我是很少用数据库的外键,中间表有字段关联就可以了吧。
forgottencoast
2023-12-11 09:42:43 +08:00
为了方便你只查物料 ID 的入库记录时不用连表查,间接在这个场景下提高性能,如果没有这需要可以不要。
yuyuf
2023-12-11 09:47:41 +08:00
主键 id 是数据库层面的唯一字段,物料唯一编码是业务层面的唯一字段。
看你们是用哪个字段做关联的
拿不准的情况,都存着,冗余一点总比后期加强
JYii
2023-12-11 09:56:08 +08:00
外键比较少用了,做删除时有点麻烦,如果有 db 迁移也麻烦
charmToby
2023-12-11 10:04:02 +08:00
早就不用物理外键了,都是逻辑外键。
themostlazyman
2023-12-11 10:05:07 +08:00
"物料 ID" 逻辑外键也不需要,联表查的话,主表设置"物料唯一编码"唯一约束、唯一索引即可。
tomatocici2333
2023-12-11 10:05:45 +08:00
别用物理外键 大坑
sss15
2023-12-11 10:14:19 +08:00
实际生产中严格按照第三范式设计的数据库比较少
生产上我觉得唯一索引还是非常非常有必要的,靠代码层面无法杜绝脏数据进去,还是得靠唯一索引
yuyuf
2023-12-11 10:16:14 +08:00
楼上说不用物理外键的,这还是要看具体情况。
一些项目并发不高,数据量不大,但对数据准确性要求高,还是能用外键的。
一般大部分互联网公司不用外键
看楼主的描述,可能是一些工业项目呢
nothingistrue
2023-12-11 10:22:58 +08:00
实体关联,不管你是数据库层面的物理外键,还是程序层面的逻辑外键,都要用物理主键,否则你也没必要再在自然键之外设计一个代理主键。

对于你的 stock_in 来说,用 material_id 做关联键,才能发挥代理主键的性能。mateiral_code 也有用,但它更多的是作为 stock_in 自身的属性来用。
jucelin
2023-12-11 10:28:37 +08:00
material_id 才是主键,mateiral_code 在入库记录中只是为了查询冗余。

mateiral_code 是业务层面的唯一,说不定哪天就 变成 mateiral_code+xxx 是唯一的了。
bugmaker1024
2023-12-11 10:34:24 +08:00
逻辑外键+1
liaojl
2023-12-11 10:38:47 +08:00
楼上有人提到了,要看具体业务,据我所了解到的,互联网公司很多都是不用物理外键的,但金融行业,比如我目前就职的某个外资银行,就有很多地方会用到,物理外键能在数据库层面保证数据的一致性,逻辑外键的话,代码要是有 bug ,导致的数据问题,要修复的话很麻烦。
dif
2023-12-11 10:41:56 +08:00
印象中外键已经是学生阶段老师讲的了,毕业工作这么多年,还真很少见到外键。
adoal
2023-12-11 11:01:31 +08:00
如果数据错了只要赔几个站内积分甚至只要道歉甚至连道歉都不用就能吧用户糊弄过去,那啥都不用搞。

如果是要真金白银赔钱,通报批评,记过处分,甚至可能坐牢,还是好好设计一下数据库,各种约束加上去。
chendy
2023-12-11 11:10:43 +08:00
具体情况具体分析,好处大于坏处就上,反过来就不上
比如说:
1. 加外键是否会对性能产生重大影响
2. 不加外键,系统逻辑是否足够完善避免脏数据产生
等等…
xuanbg
2023-12-11 11:35:53 +08:00
没必要有外键,但外键也不是什么大坑,相关言论有点过于耸人听闻了。
wushigejiajia01
2023-12-11 11:47:10 +08:00
mateiral_code: 物料唯一编码
能保证唯一,那物料 ID ,就没必要了啊,
过度冗余数据也不是个好习惯
totoro52
2023-12-11 13:13:19 +08:00
大学生才用数据库外键
IvanLi127
2023-12-11 14:22:43 +08:00
只要你的数据库只有你的程序能写,并且你的程序能可靠地约束写入的数据的正确性,多步操作失败时能有效回滚,数据库可以不加外键。这个就看实力了。。如果项目不大也不用考虑后续运维菜鸡的问题,所以我建议数据库顶得住,加个外键约束挺好的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/999254

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX