前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >DotNET企业架构应用实践-数据库表记录的唯一性设计的设计兼议主键设定原则

DotNET企业架构应用实践-数据库表记录的唯一性设计的设计兼议主键设定原则

作者头像
魏琼东
发布于 2018-01-12 06:24:05
发布于 2018-01-12 06:24:05
69800
代码可运行
举报
文章被收录于专栏:魏琼东魏琼东
运行总次数:0
代码可运行
简要介绍

         在我们进行数据库设计的时候,大家都会考虑到数据表主键的设计,而可能没有人去关注记录唯一性字段设计,或者说,很多开发人员把这两种混合在一起处理,即就是表记录的唯一性与主键相结合的技术,因为从本质上讲,表主键的值是必须唯一的,他即能确保表记录的唯一性。

         我在本文提出的思路是分离表记录的唯一性与主表键的设计,也可以理解为是双主键的设计思路,即唯一性设计可以与表业务无关,而表主键的设计必须与业务相关联,一个主键记录一定能具有一定的业务意义。

主键设计的争议

         关于数据库主键设计的一些原则与所采用的技术,园子中有大量的文章讨论,我选择两片具体代码性的文章,听棠.NET数据库主键设计之思考zhenyulu小议数据库主键选取策略(原创)两篇文章。

         关于数据库主键设计的一些原则与所采用的技术,园子中有大量的文章讨论,我选择两片具体代码性的文章,数据库主键设计之思考小议数据库主键选取策略(原创)两篇文章。

         在数据库主键设计之思考一文中,作者把数据库主键设计讲的很透彻,他也提出了主键设计与具体业务无关的论点:

“我强调主键不应该具有实际的意义,这可能对于一些朋友来说不太认同,比如订单表吧,会有“订单编号”字段,而这个字段呢在业务实际中本身就是应该具有唯一性,具有唯一标识记录的功能,但我是不推荐采用订单编号字段作为主键的,因为具有实际意义的字段,具有“意义更改”的可能性,比如订单编号在刚开始的时候我们一切顺利,后来客户说“订单可以作废,并重新生成订单,而且订单号要保持原订单号一致”,这样原来的主键就面临危险了。因此,具有唯一性的实际字段也代表可以作为主键。因此,我推荐是新设一个字段专门用为主键,此主键本身在业务逻辑上不体现,不具有实际意义。而这种主键在一定程序增加了复杂度,所以要视实际系统的规模大小而定,对于小项目,以后扩展不会很大的话,也查允许用实际唯一的字段作主键的。”

         从个人的经历和技术角度来讲,我不同意这个主键与业务无意义的观点,我的观点是主键必须与业务相关,即一个表主键字段或者表主键字段组合必须具体一定的业务意义,并且增加一个与业务无关而有能确保记录唯一性的字段,即表的唯一性字段:

         我列举一个例子,在商品进销存业务中的入库记录中记录个如下信息:

Ø dbo.PIN(产品入库表)

image.png
image.png

业务要求同一入单可以包含1-N条产品库入库信息,同一入库单不得包含两条或条件以上的同一编码的商品记录,由此我们可以知道,入库单据号BillCode及产品编码Code即可以确定一笔交流,其组合是符合主键设立原则的,同时我们在主中增加了一个字段IDN,用于确保记录的唯一性。

相关的技术

         表记录唯一性设计的技术我在本文不做详细的介绍,在数据库主键设计之思考小议数据库主键选取策略(原创)两篇文章文章之中都有非常详细的论述,请大家去这两篇文章参考,他们建议这些技术使用于主键,而我更主张用于记录的唯一性确认上。

我推荐的选择

         他多种唯一性确立技术之中,我比较喜欢“手动增长型字段”的设计,即在系统中增加一个表包含至少两个字段,Key和Value,如下所示:

image.png
image.png

         同时,数据库中提供以下存储过程:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	CREATE  procedure eas.GetIdentityValue
		@itemKey char(128)
	AS
	BEGIN TRANSACTION
		update eas.IDENTITYVALUES Set ITEMVALUE = ITEMVALUE + 1 where ITEMKEY = @itemKey
		select ITEMVALUE from eas.IDENTITYVALUES where ITEMKEY = @itemKey
	COMMIT TRANSACTION
	GO         

         值可以采用整性或者长整性进行存储,在具体应用的过程之中,在应用表中增加一个字段,插入数据时取这个过程的返回值,如:

                  exec eas.GetIdentityValue @itemKey =“dbo.PIN”

数据分区的扩展

         记录唯一性设计除了确保数据表记录的唯一性之外,还能为数据分区提供支持,不过这有一点要求,即唯一性设计必须采用整性或者并且一定连续意义的值才能处理,而如GUID这样的没有办法在将来支持扩展分区的设计。

         本文先到此为止,在后面的文章中将会应用到这种技术并进行详细的讲解。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2010-10-15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Highcharts-6-柱状图汇总
本文重点介绍的是可视化库Highcharts的相关基础知识,以及如何利用Highcharts来绘制不同场景和需求下的精美柱状图,主要内容包含:
皮大大
2021/03/01
3.3K0
Highcharts-6-柱状图汇总
Highcharts-12-绘制基础折线图
Highcharts-12-绘制基础折线图 本文中介绍的是如何利用python-highcharts绘制折线图 指定x轴数据标签 显示点值的数据 显示最值和均值的折线图 可缩放的X轴 指定x轴数据标签
皮大大
2021/03/23
1.6K0
Highcharts-12-绘制基础折线图
Highcharts-4-堆叠柱状图
Highcharts-4-柱状图2 本文继续介绍Highcharts中柱状图的制作,主要讲解了3种柱状图的制作: 堆叠柱状图 分组堆叠柱状图 带有百分比堆叠柱状图 垂直堆叠柱状图 效果图 先看下整体的
皮大大
2021/03/01
1.6K0
Highcharts-4-堆叠柱状图
Highcharts快速入门及绘制柱状图
本文重点介绍的是可视化库Highcharts的相关基础知识,以及如何利用Highcharts来绘制不同场景和需求下的精美柱状图,主要内容包含:
皮大大
2021/02/21
3.4K0
Highcharts快速入门及绘制柱状图
新手学HighCharts(一)----基本使用
最近做的项目需要用到数据分析,图表显示,之前做项目的时候用到过highcharts,不过也只是简单的会用而已,然后再网上查了查highcharts的优点:
令仔很忙
2018/09/14
2.4K0
新手学HighCharts(一)----基本使用
Highcharts-3-绘制柱状图
Highcharts-3-绘制柱状图 本文介绍的是如何利用python-highcharts绘制柱状图 水平/垂直柱状图 蝴蝶柱状图 堆叠柱状图 带有负值柱状图 水平/垂直柱状图 图形 首先我们直接看
皮大大
2021/03/01
2.5K0
Highcharts-3-绘制柱状图
新手学HighCharts(二)----对比柱状图的动态加载
上一篇文章 新手学HighCharts(一)—-基本使用 中介绍了highCharts的基本使用,今天给大家介绍对比柱状图的使用,贴张图先:
令仔很忙
2018/09/14
1.2K0
新手学HighCharts(二)----对比柱状图的动态加载
Highcharts-10-饼图颜色设置
实现上面的效果主要是通过'color': 'Highcharts.getOptions().colors[0]方法。当colors[i]中的i取相同的值,则颜色会相同。
皮大大
2021/03/07
2.6K0
Highcharts-9-双饼图绘制
Highcharts-9-双饼图制作 本文中只介绍一种和饼图相关的图形:双饼图 双饼图 效果 代码 # -*- coding: utf-8 -*- """ 说明:制作双饼图 作者:Peter """
皮大大
2021/03/07
1.2K0
Highcharts-7-下钻图制作
下钻表示的是通过层级的方式来展示数据,比如我们想查看国内人口数的占比情况,我们可以先看各个省份的情况,接着我们想看具体某个省中各个地级市的占比,这就是通过下钻方式实现。
皮大大
2021/03/04
1.7K0
Highcharts-7-下钻图制作
R语言实现与Javascript交互的可视化展示
R语言在可视化的展示上具有很强大的功能,并且可以跟很多语言进行结合使用构建交互的可视化图像。今天给大家介绍下在R语言中如何生成基于Javascript的可视化界面。首先需要用的R包是rCharts,大家看下包的安装:
一粒沙
2021/08/23
1.2K0
R语言实现与Javascript交互的可视化展示
pyEcharts 大儿子,会动的柱状图首先登场
pyEcharts 是一款将 Python 和 Echars 结合起来的强大可视化神器,大家近期看到的诸如疫情路线图都可以分分钟实现!是不是已经迫不及待了,接下来小编带领大家一步步走进 pyecharts 的世界,各种神图手到擒来!!
数据山谷
2020/11/24
6510
pyEcharts 大儿子,会动的柱状图首先登场
Highcharts使用的一些总结
Highcharts 是一个用纯 JavaScript 编写的一个图表库, 能够很简单便捷的在 Web 网站或是 Web 应用程序添加有交互性的图表,并且免费提供给个人学习、个人网站和非商业用途使用。
王小婷
2018/08/22
1.1K0
Highcharts使用的一些总结
HightCharts 熟悉不?Python也可以绘制同款~~
今天小编给大家推荐一个超强交互式可视化绘制工具-python-highcharts,熟悉HightCharts绘图软件的小伙伴对这个不会陌生,python-highcharts就是使用Python进行Highcharts项目绘制,简单的说就是实现Python和Javascript之间的简单转换层,话不多说,我们直接进行介绍,具体包括以下几个方面:
DataCharm
2022/05/24
9740
HightCharts 熟悉不?Python也可以绘制同款~~
強大的jQuery Chart组件-Highcharts
Highcharts是一个制作图表的纯Javascript类库,主要特性如下: 兼容性:兼容当今所有的浏览器,包括iPhone、IE和火狐等等; 对个人用户完全免费; 纯JS,无BS; 支持大部分的图表类型:直线图,曲线图、区域图、区域曲线图、柱状图、饼装图、散布图; 跨语言:不管是PHP、Asp.net还是Java都可以使用,它只需要三个文件:一个是Highcharts的核心文件highcharts.js,还有a canvas emulator for IE和Jquery类库或者MooTools类库; 提
张善友
2018/01/22
2.2K0
強大的jQuery Chart组件-Highcharts
【前端统计图】echarts实现简单柱状图项目地址下载:
图片.png <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>五分钟上手之柱状图</title> <!-- 引入 echarts.js --> <script src="js/echarts.min.js"></script> <script src="js/jquery-1.11.3.js"></script> </
王小婷
2018/05/31
1.4K0
Highcharts-8-基础饼图绘制
本文中介绍的是如何在jupyter notebook中通过python-highcharts绘制常见的饼图:
皮大大
2021/03/07
1.9K0
Django教程第5章 | Web开发实战-数据统计图表(echarts、highchart)
echarts方案:通过jQuery自带ajax向服务端发送请求获取折线图、柱状图、饼图数据。
仲君Johnny
2024/01/24
4510
Django教程第5章 | Web开发实战-数据统计图表(echarts、highchart)
「AntV」基于 AntV G2Plot 来实现一个 堆叠柱状图 加 折线图 的多图层案例
最近研究了一下antv/g2的组合图例,并尝试做了一个不算太难的组合图,下面介绍一下整个图里的实现过程。
拿我格子衫来
2023/08/24
1.7K0
「AntV」基于 AntV G2Plot 来实现一个 堆叠柱状图 加 折线图 的多图层案例
G2 基本使用 折线图 柱状图 饼图 基本配置
  1.浏览器引入 <!-- 引入在线资源 --> <script src="https://gw.alipayobjects.com/os/lib/antv/g2/3.4.10/dist/g2.min.js"></script>
用户1197315
2019/05/25
4.9K0
推荐阅读
相关推荐
Highcharts-6-柱状图汇总
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档