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

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

简要介绍

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

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

主键设计的争议

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

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

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

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

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

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

Ø dbo.PIN(产品入库表)

表名

PIN

所有者

dbo

列名

数据类型

说明

IDN

INT

Y

ID

BillCode

VARCHAR(16)

Y

单根号

Code

VARCHAR(16)

Y

产品编码

Name

VARCHAR(128)

Y

产品名称

Spec

VARCHAR(64)

N

规格

Unit

VARCHAR(32)

N

单位

Price

DECIMAL(18,4)

Y

价格

Number

INT

Y

数量

Operator

VARCHAR(64)

Y

入库员

InTime

DATETIME

N

和库时间

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

相关的技术

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

我推荐的选择

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

Ø eas.IDENTITYVALUES(唯一值记录)

表名

IDENTITYVALUES

所有者

eas

列名

数据类型

说明

GUID

UNIQUEIDENTIFIER

N

Guid

ITEMKEY

NVARCHAR(128)

Y

关键字

ITEMVALUE

INT

N

当前值

DESCRIPTION

NVARCHAR(256)

N

说明

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

	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这样的没有办法在将来支持扩展分区的设计。

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

         文未我加点广告,谢谢!

链接

一步一步教你使用AgileEAS.NET基础类库进行应用开发-系列目录

AgileEAS.NET平台开发指南-系列目录

AgileEAS.NET应用开发平台介绍-文章索引

AgileEAS.NET平台应用开发教程-案例计划

AgileEAS.NET官方网站

敏捷软件工程实验室

QQ群:116773358(AgileEAS.NET平台)

目录
相关文章
|
存储 SQL 分布式计算
阿里腾讯今日头条纷纷翻牌子,ClickHouse到底有什么本事?
ClickHouse是近年来备受关注的开源列式数据库,主要用于数据分析(OLAP)领域。目前国内社区火热,各个大厂纷纷跟进大规模使用
2256 0
阿里腾讯今日头条纷纷翻牌子,ClickHouse到底有什么本事?
|
8天前
|
人工智能 JavaScript Linux
【Claude Code 全攻略】终端AI编程助手从入门到进阶(2026最新版)
Claude Code是Anthropic推出的终端原生AI编程助手,支持40+语言、200k超长上下文,无需切换IDE即可实现代码生成、调试、项目导航与自动化任务。本文详解其安装配置、四大核心功能及进阶技巧,助你全面提升开发效率,搭配GitHub Copilot使用更佳。
|
2天前
|
JSON API 数据格式
OpenCode入门使用教程
本教程介绍如何通过安装OpenCode并配置Canopy Wave API来使用开源模型。首先全局安装OpenCode,然后设置API密钥并创建配置文件,最后在控制台中连接模型并开始交互。
1305 3
|
10天前
|
存储 人工智能 自然语言处理
OpenSpec技术规范+实例应用
OpenSpec 是面向 AI 智能体的轻量级规范驱动开发框架,通过“提案-审查-实施-归档”工作流,解决 AI 编程中的需求偏移与不可预测性问题。它以机器可读的规范为“单一真相源”,将模糊提示转化为可落地的工程实践,助力开发者高效构建稳定、可审计的生产级系统,实现从“凭感觉聊天”到“按规范开发”的跃迁。
1578 17
|
9天前
|
人工智能 JavaScript 前端开发
【2026最新最全】一篇文章带你学会Cursor编程工具
本文介绍了Cursor的下载安装、账号注册、汉化设置、核心模式(Agent、Plan、Debug、Ask)及高阶功能,如@引用、@Doc文档库、@Browser自动化和Rules规则配置,助力开发者高效使用AI编程工具。
1241 5
|
10天前
|
消息中间件 人工智能 Kubernetes
阿里云云原生应用平台岗位急招,加入我们,打造 AI 最强基础设施
云原生应用平台作为中国最大云计算公司的基石,现全面转向 AI,打造 AI 时代最强基础设施。寻找热爱技术、具备工程极致追求的架构师、极客与算法专家,共同重构计算、定义未来。杭州、北京、深圳、上海热招中,让我们一起在云端,重构 AI 的未来。
|
12天前
|
IDE 开发工具 C语言
【2026最新】VS2026下载安装使用保姆级教程(附安装包+图文步骤)
Visual Studio 2026是微软推出的最新Windows专属IDE,启动更快、内存占用更低,支持C++、Python等开发。推荐免费的Community版,安装简便,适合初学者与个人开发者使用。
1265 11
|
7天前
|
云安全 安全
免费+限量+领云小宝周边!「阿里云2026云上安全健康体检」火热进行中!
诚邀您进行年度自检,发现潜在风险,守护云上业务连续稳健运行
1177 2
|
13天前
|
人工智能 测试技术 开发者
AI Coding后端开发实战:解锁AI辅助编程新范式
本文系统阐述了AI时代开发者如何高效协作AI Coding工具,强调破除认知误区、构建个人上下文管理体系,并精准判断AI输出质量。通过实战流程与案例,助力开发者实现从编码到架构思维的跃迁,成为人机协同的“超级开发者”。
969 91