abc`1 2022-05-27 13:59 采纳率: 73.7%
浏览 107
已结题

表外键使用技术主键还是业务主键?

一张表与另一张表有关联关系,外键使用技术主键还是业务主键,各有什么利弊呢

  • 写回答

2条回答 默认 最新

  • leaf_cq 2022-05-27 14:44
    关注

    1、首先,当初表设计时,为什么使用技术主键而不会用业务主键作为主表的主键呢?一般来说,当业务主键在表中不会(或者业务要求不能)重复时,表的主键就应该设计为业务主键,毕竟多一个字段会占用不必要的存储空间,查询时还需要关联转换;当业务主键在该表中有可能(即便概率非常小)有重复时,就必须使用技术主键来作为该表的主键,否则一旦重复,将导致业务异常或程序崩溃。比如说用户表的登录账户就属于必须唯一,而交易表中的交易时间就属于可能唯一(如果遇到并发,即便精确到微秒级,重复的概率依然是存在的)

    2、再来说题主的问题,既然设计了技术主键,那从理论上来说(因为不清楚你的业务),应该使用技术主键作为外键,除非你非常清楚业务主键在主表的所有记录及业务可能性来说是唯一的,才能作为外键,但一旦有你未考虑的情况导致业务主键重复,那关联表将无法通过外键区分其记录到底属于哪一条业务主键,当然,好处就是可以在查询的时候直接通过业务主键查询外键表的数据而不用去关联主表

    3、实际上很多的数据库设计都完整的设计了外键,但在生成数据库脚本的时候,并未生成外键关系,只保留了外键列的索引,因为实际业务往往非常复杂,系统的使用者又千差万别,你无法保证你的系统不出BUG,也无法保证业务的使用者全部按常规操作来处理,即便操作没有问题,实际发生的业务也往往需要回退或调整的时候,如果这个时候遇到外键的循环关联或者其他较为复杂的情况,数据运维人员就哭吧……搞不好还得停生产系统来调数据……虽然不建外键也会导致很多问题,但基本都可以通过升级程度或在线调整数据来解决,不需要停生产系统,毕竟24小时运行的系统不在少数。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 9月30日
  • 已采纳回答 9月22日
  • 创建了问题 5月27日

悬赏问题

  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大
  • ¥15 import arcpy出现importing _arcgisscripting 找不到相关程序