Mysql 数据库需不需要主键 Id?

2020-03-19 10:20:04 +08:00
 wangbenjun5

最近接触了一个项目,里面的数据库设计让我“大开眼界”,很多表没有主键 id,取而代之的是复合主键,也就是几个字段同时作为主键,比如说: A 表:

name
age
addr

主键是 name+age

B 表:

name
age
money
something
xxx

主键也是 name+age

实际上 B 表是 A 表的附属表,也就说是补充 A 表的内容,或者是关联到其它表

恕我愚昧,不知道这种设计有什么好处,我觉得用 id 当主键更简介方便,便于修改数据,比如上面的例子有时候还有修改 age 的需求,这时候就非常麻烦了,难道这是反范式化设计,故意做的数据冗余,我不敢苟同,咱也不敢问,咱也不敢说。

各位大佬,求打醒!!!

13498 次点击
所在节点    MySQL
99 条回复
tabris17
2020-03-19 10:23:15 +08:00
理论上当然可以不需要自增 ID 当主键,但是实际这么操作会被人打的
littleylv
2020-03-19 10:23:40 +08:00
万一有两个人都是叫“张三”,同时 20 岁,咋办
tabris17
2020-03-19 10:24:30 +08:00
另外用非自增 ID 做主键,会增加随机写入的概率,insert 操作性能会降低
Uyuhz
2020-03-19 10:24:33 +08:00
如果同名同岁怎么办...
ytmsdy
2020-03-19 10:28:40 +08:00
这是学生的毕业设计才会出现的情况吧。
没有主键,怎么非常明确简单的定位一条数据?
写 sql,查找删除的时候,估计多谢几次就像打人了
amon
2020-03-19 10:29:50 +08:00
同意,这是典型没有经验的设计体现,或者说压根没有设计。
fancy111
2020-03-19 10:32:51 +08:00
我觉得唯一的可能就是为了防止名字重复,设计者为了偷懒不在后端验证,直接数据库禁止。
比如注册时提交的姓名重复,一般做法是先 select 数据库判断重复,再插入。它这样可以省去查询这一步,直接 insert,失败成功一目了然。
而为什么要把 A 表分离出来,也是为了查询性能。有好有坏吧,主要看网站业务。
另外 A 表应该不会加 age 字段,只会加不常修改的。
Jooooooooo
2020-03-19 10:33:49 +08:00
@fancy111 防止重复弄成唯一键就好了, 主键 id 还是不能省的.
IMCA1024
2020-03-19 10:35:07 +08:00
问题非常大。。
更新岁数,物理删除数据,同名怎么办,除非你告诉我这个不用更新岁数和不删除
fancy111
2020-03-19 10:35:49 +08:00
@Jooooooooo 既然用不到 ID,那当然可以省。
littleylv
2020-03-19 10:36:14 +08:00
@fancy111 #7 数据库层面的防止重复可以用 unique index i_name_age(name, age)
chendy
2020-03-19 10:36:52 +08:00
这就是瞎搞,鉴定完毕
fancy111
2020-03-19 10:38:04 +08:00
@littleylv 就是这么用啊,那省掉 ID 有问题吗? ID 在业务上用不到。
littlewing
2020-03-19 10:38:36 +08:00
不一定需要自增主键
但以 name + age 作为联合主键是谁出的馊主意... ... 你至少给我用个身份证号,手机号什么的吧
wysnylc
2020-03-19 10:39:18 +08:00
要,而且主键不要与业务关联
loading
2020-03-19 10:39:38 +08:00
别的不提,真在数据库里面用 age ?每年改一次?
littlewing
2020-03-19 10:40:48 +08:00
@fancy111 自增主键对于 MySQL InnoDB 来说,插入性能和空间利用率更高。另外,如果要更新 name 或 age,更新主键比更新非主键效率低
littleylv
2020-03-19 10:40:55 +08:00
@fancy111 #13 表面上来看当然没问题,作为简单的系统设计省掉 id 当然没问题
不过,你可以试试下次在你的工作里这么设计表试试,我看看你同事打不打你
DamonLin
2020-03-19 10:41:12 +08:00
肯定要啦,不然编辑更新删除问题很大,新增插入倒没啥
wangbenjun5
2020-03-19 10:42:07 +08:00
@littleylv 这里只是举个例子,实际不是这个表
@Uyuhz

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

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

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

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

© 2021 V2EX