开发者社区 问答 正文

在数据库设计中,无论如何也该设计一个自增ID字段作为主键吗?

本人菜鸟,有个问题困惑了我挺久,今天决定提出来问问大家正确或常用的做法

举个简单的例子

文章表: id,标题,内容,……
标签表: id,标题

以上两张表显然都是需要自增ID作为主键以确保唯一性的

接下来要设计一个关联表,把文章和标签之间关联起来

文章标签关联表: id,文章id,标签id

可以看出实际上我只需要后面两个字段就能够实现功能了。这是否意味着我完全可以放弃自增的id字段呢?甚至是可以放弃使用主键,单纯加索引就行了呢?

如果自增ID主键不是必须的,请问我该如何判断是否需要它?仅仅通过业务需求来判断吗?

恳请各位不吝赐教,谢谢

展开
收起
a123456678 2016-07-04 16:21:42 3387 分享 版权
1 条回答
写回答
取消 提交回答
  • 首先说一下主键和索引概念上的不同,主键只是个声明,通过哪些字段能标识出表的唯一纪录,只不过是通过唯一索引实现的。

    关系型数据库中绝大部分的表,建议有唯一的主键(包括你说的自增ID或UUID方式),属于逻辑主键的范围,主要是为了程序后续开发方便,尤其是在Web应用上,这个Id可以很方便的在超链接中作为参数传递,如:editPost.do?id=123

    在你说的文章标签关联表的例子中,一般会在文章展示和编辑页面中,显示关联的标签,就像segmentfault在提问的页面会显示所属的标签一样,如果没有这个id,编辑时删除一个标签,假设是通过一个Ajax请求实现的,可以按照这样的url:deleteTagOfPost.do?id=123,如果没有的话就会麻烦很多,需要把能够确定这一行记录的多个字段值都放到参数中,如:deleteTagOfPost.do?postId=123&tagId=456,显然有逻辑主键会更方便一些。

    另外,用多个字段的组合作为主键来确定唯一的记录行,属于物理主键的范畴,是和业务的规则强相关的,在开发的方便性、扩展性上不如逻辑主键。

    2019-07-17 19:50:51
    赞同 展开评论