关于数据库主键的设计

zhouminwen 2017-05-19 02:11:41
最近新换了一家公司猛然在发现数据库设计方面和以前公司完全不一样。以前我们的数据库依据主要业务创建主键ID后,别的关联表都会以这个主键为其复合主键。比如学生表、课程表和成绩表,成绩表会以学生表和课程表的主键为复合主键。但是在新的公司基本上成绩表的主键都会是自增主键,然后有两个字段分别是学生表和课程表的主键。我就想问问这种设计是基于什么考量的,因为我发现在这种设计情况下很容易出现重复数据。
...全文
170 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ACMAIN_CHM 2017-05-23
  • 打赏
  • 举报
回复
学生表,如果学号能够成为主键则不需要额外再使用自动编号。 原设计哪些的可能原因很多,比如当时的设计师根本不懂范式。或者半调子设计师听网上大牛说数字主键索引比文本索引更有效率。
二月十六 2017-05-22
  • 打赏
  • 举报
回复
引用 4 楼 shinesky 的回复:
[quote=引用 3 楼 sinat_28984567 的回复:] [quote=引用 2 楼 shinesky 的回复:] [quote=引用 1 楼 sinat_28984567 的回复:] 主关键字(primary key)是表中的一个或多个字段,它的值用于唯一地标识表中的某一条记录。 为什么这么设计可以问一下公司的工作人员。 为什么会容易出现重复数据呢?
很好理解呀,楼主说的成绩表,如果前台或后台程序没有限制的话,重复的两条记录录进去是不会有错的,因为主键是自增列,顺序加1而已。个人觉得这种设计不合理。[/quote] 前台后台为什么没有限制呢?如果没有限制的话,用复合主键的插入重复数据是不是项目就报错了?[/quote] 这就是项目的健壮性的问题了,从数据库的设计是否合理的角度上来讲,楼主所说的这张成绩表,需求上应该是不充许重复的,而且这种没有意义的主键太多的话,不容易理解项目的业务逻辑,再说,从数据操作的效率上讲,这种关联表,最终还是得额外再建索引,自增列没有任何意义。[/quote] 所以我觉得不管哪个设计,重复数据都不会容易产生,才问了楼主为什么会产生重复数据
shinesky 2017-05-22
  • 打赏
  • 举报
回复
引用 3 楼 sinat_28984567 的回复:
[quote=引用 2 楼 shinesky 的回复:] [quote=引用 1 楼 sinat_28984567 的回复:] 主关键字(primary key)是表中的一个或多个字段,它的值用于唯一地标识表中的某一条记录。 为什么这么设计可以问一下公司的工作人员。 为什么会容易出现重复数据呢?
很好理解呀,楼主说的成绩表,如果前台或后台程序没有限制的话,重复的两条记录录进去是不会有错的,因为主键是自增列,顺序加1而已。个人觉得这种设计不合理。[/quote] 前台后台为什么没有限制呢?如果没有限制的话,用复合主键的插入重复数据是不是项目就报错了?[/quote] 这就是项目的健壮性的问题了,从数据库的设计是否合理的角度上来讲,楼主所说的这张成绩表,需求上应该是不充许重复的,而且这种没有意义的主键太多的话,不容易理解项目的业务逻辑,再说,从数据操作的效率上讲,这种关联表,最终还是得额外再建索引,自增列没有任何意义。
二月十六 2017-05-22
  • 打赏
  • 举报
回复
引用 2 楼 shinesky 的回复:
[quote=引用 1 楼 sinat_28984567 的回复:] 主关键字(primary key)是表中的一个或多个字段,它的值用于唯一地标识表中的某一条记录。 为什么这么设计可以问一下公司的工作人员。 为什么会容易出现重复数据呢?
很好理解呀,楼主说的成绩表,如果前台或后台程序没有限制的话,重复的两条记录录进去是不会有错的,因为主键是自增列,顺序加1而已。个人觉得这种设计不合理。[/quote] 前台后台为什么没有限制呢?如果没有限制的话,用复合主键的插入重复数据是不是项目就报错了?
shinesky 2017-05-22
  • 打赏
  • 举报
回复
引用 1 楼 sinat_28984567 的回复:
主关键字(primary key)是表中的一个或多个字段,它的值用于唯一地标识表中的某一条记录。 为什么这么设计可以问一下公司的工作人员。 为什么会容易出现重复数据呢?
很好理解呀,楼主说的成绩表,如果前台或后台程序没有限制的话,重复的两条记录录进去是不会有错的,因为主键是自增列,顺序加1而已。个人觉得这种设计不合理。
zhouminwen 2017-05-22
  • 打赏
  • 举报
回复
基本上所有的业务表好像都是这样设计的,目前来看是他们的check做的不完善,有的功能没有添加重复记录筛选,这个是系统bug会修复。但是总感觉这种每次插入前检查数据库是否有重复项很不人性,尤其是在做批量插入的时候。
二月十六 2017-05-20
  • 打赏
  • 举报
回复
主关键字(primary key)是表中的一个或多个字段,它的值用于唯一地标识表中的某一条记录。 为什么这么设计可以问一下公司的工作人员。 为什么会容易出现重复数据呢?

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧