关系型数据库表结构的设计,有下面两个设计技巧:

物理主键作为关联的外键

关系型数据库,由多个数据表构成。每一个数据表的结构是相同的,不同表之间可能存在关联关系。表之间的关联关系,正是关系型数据库得名的原因。

一个表由多个字段构成。其中可能有多个字段适合作为主键。主键字段,就是表中每一行都不会有重复数据的字段。

主键,可以分为两种:物理主键和逻辑主键。

每一张数据库的表,都使用自增长的id字段作为物理主键。

多表之间的外键关联,都关联其他表的物理主键,也就是关联其他表的id字段。

逻辑主键,就是除了id字段外的不重复的字段。我们设计数据库的外键关联时,不使用逻辑主键,而是使用物理主键。

这是因为,物理主键肯定是主键,因为它是自增的。(对于不支持自增字段的关系数据库,可以使用uuid保证物理主键的唯一性)

而逻辑主键,则可能随着业务的发展,成为可重复的字段。一旦这种情况发生,关系数据库的外键关系就被破坏了。如,可能你觉得姓名是逻辑主键,但可能后面发现有人重名,那么这个字段就不再是主键了。而如果之前使用这个字段作为外键,那么查询返回的数据就不是一一对应的了。

这就是为什么要使用物理主键,以及用物理主键作为关联外键的原因。

使用乐观锁更新依赖之前状态的记录

考虑这样一种数据库的应用场景:

任务单的接管:多个操作人员从一个任务池中接管一个任务。只有第一个获取任务的操作人员才能成功接管该任务,后续操作人员的接管操作都必须失败。

这时,就需要一种数据库记录的锁定机制。只有第一个事务才能更新记录。

数据库可以使用悲观锁和乐观锁来锁定数据库记录。

悲观锁是如下sql语句实现的:

1
SELECT * FROM t FOR UPDATE

这条语句会在其他修改内容的事务提交后返回最新的数据。

一旦执行这条语句,这些记录就被锁住了,不能被其他sql事务修改。直到本事务提交。

乐观锁,是应用程序实现的,不是数据库实现的机制。乐观锁,对于数据库来说,就是没有上锁。事务可以select其他事务已经提交的数据。更新数据时,数据库保证多个事务的更新是原子的。

悲观锁,会导致事务等待其他事务完成。乐观锁,只会等待其他事务的更新语句的完成,不会等待整个事务完成,因此效率较高。

实现乐观锁的方法:

给数据库表添加一个version字段。version是一个数字类型的字段,每次更新都加1。每次更新时都要检测version字段是否和当前事务的值相同。如果version字段不同,那么就表明在查询数据之后,有其他事务已经更新了该记录,就会导致此次更新失败。应用必须重新载入最新的数据,然后重新更新数据。

如果使用乐观锁,那么如果数据库中version和应用中version相同,则用version+1的版本值更新version字段。

SQL语句如下:

1
update studentVersion set ver=?, name=? where id=? and ver=?

不使用锁更新独立状态的记录

考虑这样一种数据库的应用场景:

需要更新虚拟机的状态。多个事务可能会同时更新虚拟机的状态为start或者stop。这种状态的更新和前一个阶段的状态是无关的,因此不需要锁定记录。直接更新即可。此时不需要使用悲观锁或者乐观锁。

如果这个表添加了version字段,直接忽略对version字段的比较和更新即可。

SQL语句如下:

1
update studentVersion set   name=? where id=?

总结

设计关系型数据库的表时,需要给表添加一个ID字段(自增字段,或者uuid字段)和一个version字段(数值类型)。ID字段作为物理主键,用于保证记录的不可重复性和用作外键关联。

version字段用于实现乐观锁,提供比悲观锁更好的性能。特别是对于UI显示并可能出现并发更新的数据,更需要使用乐观锁来提升数据库访问性能。

对于后台自动更新的任务,可以使用乐观锁实现。但需要在冲突发生时实现自动退让。也可以使用悲观锁在数据库上对事务进行排队来解决更新冲突问题。

对于不关心记录的状态之间关系的场景,可以直接更新记录,忽略掉version字段的检测和更新。

from:http://blog.jobbole.com/100060/

伯乐在线 - 良少

关系型数据库表结构的两个设计技巧相关推荐

  1. MySQL数据库表结构的设计

    一.前言 1.1 关系型数据库 数据库关系型模型的概念最早由"关系数据库之父"之称的埃德加·弗兰克·科德(Edgar Frank Codd或E. F. Codd)博士提出,1970 ...

  2. ezdml 支付mysql 吗_关于EZDML数据库表结构制作设计工具使用踩的坑

    我使用的是一款EZDML的数据库表结构制作设计工具 最开始在数据库创建数据库名为personalmall,基字符集为默认,数据库排序规则也是默认,创建完成之后 去EZDML生成SQL 点击执行sql ...

  3. ezdml 支付mysql 吗_EZDML数据库表结构设计器_设计sql、oracle、mysql数据库表结构 V2.39 免费版...

    很多程序员或者网站站长在设计网站数据库的时候都要进行表结构设计,如果您不想操作原始的数据库工具之想简单设计一下数据库表结构,那么你不妨试试这款EZDML数据库表结构设计器,可以快速设计sql.orac ...

  4. 如何比较两个数据库表结构的不同

    这些天在做基于开源系统二次开发,边改边加字段. 线上还运行了之前改好的系统. 表结构的设计管理混乱. 又没有好的办法,网上找的一下也没有很好的办法. 很多软件可以生成变更的sql代码,但不能直观查看便 ...

  5. 根据数据库表结构生成Excel表设计——源码设计说明

    根据数据库表结构生成Excel表设计 在系统运维的过程中,很多时候大家都不喜欢改文档,修改了数据库字段后很少同步再更新表设计文档的,这就导致系统运行一段时间后,系统表设计与实际生产跑业务的设计出入很大 ...

  6. 根据数据库表结构生成Excel表设计——工具介绍

    根据数据库表结构生成Excel表设计 最近又接手了一些老系统,库表设计啥的都没有,十来个系统,每个系统都几十张表,一个个的补感觉太难了,合计了一下感觉还是搞个工具比较好. 在系统运维的过程中,很多时候 ...

  7. mysql怎么对比表结构_mysql怎么对比两个数据库表结构

    mysql怎么对比两个数据库表结构 发布时间:2021-02-03 11:45:58 来源:亿速云 阅读:58 作者:小新 这篇文章主要介绍了mysql怎么对比两个数据库表结构,具有一定借鉴价值,感兴 ...

  8. 尝试设计出“网易新闻模块”(或者其他感兴趣项目)的数据库表结构

    一.尝试设计出"网易新闻模块"(或者其他感兴趣项目)的数据库表结构 完成时间:2020.11.19 项目环境:MySQL.Navicat.Win10: 思路 1.首先将网页简单分为 ...

  9. python同步两张数据表_Python 如何实现数据库表结构同步

    近日,某个QQ 群里的一个朋友提出一个问题,如何将一个DB 的表结构同步给另一个DB. 针对这个问题,我进行了思考与实践,具体的实现代码如下所示: # coding:utf-8 import pymy ...

最新文章

  1. 阿里发布AliGenie2.0系统,“百箱大战”用上视觉武器
  2. 利用反射光电管 ITR9909 制作节能信标光电感应开关
  3. 标准W3C盒子模型和IE盒子模型CSS布局经典盒子模型(转)
  4. python能处理多大的数据-Python 适合大数据量的处理吗?
  5. mysql now str,数据库学习之MySQL (十)—— 日期和时间函数 NOW STR_TO_DATE DATE_FORMAT 流程控制函数 IF IFNULL CASE...
  6. mysql主从克隆服务器_mysql主从复制服务器配置
  7. different color in Chrome Development Tool
  8. Zabbix触发器_action动作及模板应用(二)
  9. PyTorch 搭建神经网络 (MNIST)[含注释]
  10. 取两堆石子(威佐夫博弈)
  11. Python数据分析之理论知识
  12. layui表单基本使用
  13. 怎么给新版edge换皮肤外观? | 怎么给edge添加chrome插件?
  14. 一文简要了解词义消歧与实体消歧
  15. libpcap简介及网络监测系统
  16. 寒月聊健康;手指麻 刺痛 无力你可能是腕管综合症
  17. 电子自旋共振波谱仪的用途和主要检测对象
  18. 腾讯百度阿里变身天使投资背后:PE估值偏低
  19. 联盟:微信封号最新规则以及解决方法
  20. 关于高精地图-导航电子地图制作测绘资质的讯息分享

热门文章

  1. Gradle Goodness: Set Java Compiler Encoding--转载
  2. spring mvc DispatcherServlet详解之二---request通过Controller获取ModelAndView过程
  3. linux主机间复制文件
  4. jquery学习手记(9)事件基础知识
  5. Newton-Raphson method
  6. Exercise: Linear Regression
  7. 阿里巴巴的五大平台野心,让“连接”论成为过去式
  8. JavaScript称霸
  9. 算法与数据结构(选择排序)
  10. 每日一博 - 延时任务的多种实现方式解读