主键的必要性:
有些朋友可能不提倡数据库表必须要主键,但在我的思考中,觉得每个表都应该具有主键,不管是单主键还是双主键,主键的存在就代表着表结构的完整性,表的记录必须得有唯一区分的字段,主键主要是用于其他表的外键关联,本记录的修改与删除,当我们没有主键时,这些操作会变的非常麻烦。
主键的无意义性:
我强调主键不应该具有实际的意义,这可能对于一些朋友来说不太认同,比如订单表吧,会有“订单编号”字段,而这个字段呢在业务实际中本身就是应该具有唯一性,具有唯一标识记录的功能,但我是不推荐采用订单编号字段作为主键的,因为具有实际意义的字段,具有“意义更改”的可能性,比如订单编号在刚开始的时候我们一切顺利,后来客户说“订单可以作废,并重新生成订单,而且订单号要保持原订单号一致”,这样原来的主键就面临危险了。因此,具有唯一性的实际字段也代表可以作为主键。因此,我推荐是新设一个字段专门用为主键,此主键本身在业务逻辑上不体现,不具有实际意义。而这种主键在一定程序增加了复杂度,所以要视实际系统的规模大小而定,对于小项目,以后扩展不会很大的话,也查允许用实际唯一的字段作主键的。
主键的选择
我们现在在思考一下,应该采用什么来作表的主键比较合理,申明一下,主键的设计没有一个定论,各人有各人的方法,哪怕同一个,在不同的项目中,也会采用不同的主键设计原则。
第一:编号作主键
此方法就是采用实际业务中的唯一字段的“编号”作为主键设计,这在小型的项目中是推荐这样做的,因为这可以使项目比较简单化,但在使用中却可能带来一些麻烦,比如要进行“编号修改”时,可能要涉及到很多相关联的其他表,就象黎叔说的“后果很严重”;还有就是上面提到的“业务要求允许编号重复时”,我们再那么先知,都无法知道业务将会修改成什么?
第二:自动编号主键
这种方法也是很多朋友在使用的,就是新建一个ID字段,自动增长,非常方便也满足主键的原则,优点是:数据库自动编号,速度快,而且是增量增长,聚集型主键按顺序存放,对于检索非常有利;数字型的,占用空间小,易排序,在程序中传递也方便;如果通过非系统增加记录(比如手动录入,或是用其他工具直接在表里插入新记录,或老系统数据导入)时,非常方便,不用担心主键重复问题。
缺点:其实缺点也就是来自其优点,就是因为自动增长,在手动要插入指定ID的记录时会显得麻烦,尤其是当系统与其他系统集成时,需要数据导入时,很难保证原系统的ID不发生主键冲突(前提是老系统也是数字型的);如果其他系统主键不是数字型那就麻烦更大了,会导致修改主键数据类型了,这也会导致其他相关表的修改,后果同样很严重;就算其他系统也是数字型的,在导入时,为了区分新老数据,可能想在老数据主键前统一加一个“o”(old)来表示这是老数据,那么自动增长的数字型又面临一个挑战。
第三:Max加一
由于自动编号存在那些问题,所以有些朋友就采用自己生成,同样是数字型的,只是把自动增长去掉了,采用在Insert时,读取Max值后加一,这种方法可以避免自动编号的问题,但也存在一个效率问题,如果记录非常大的话,那么Max()也会影响效率的;更严重的是并发性问题,如果同时有两人读到相同的Max后,加一后插入的ID值会重复,这已经是有经验教训的了。
第四:自制加一
考虑Max加一的效率后,有人采用自制加一,也就是建一个特别的表,字段为:表名,当前序列值。这样在往表中插入值时,先从此表中找到相应表的最大值后加一,进行插入,有人可能发现,也可能会存在并发处理,这个并发处理,我们可以采用lock线程的方式来避免,在生成此值的时,先Lock,取到值以后,再unLock出来,这样不会有两人同时生成了。这比Max加一的速度要快多了。但同样存在一个问题:在与其他系统集成时,脱离了系统中的生成方法后,很麻烦保证自制表中的最大值与导入后的保持一致,而且数字型都存在上面讲到的“o”老数据的导入问题。因此在“自制加一”中可以把主键设为字符型的。字符型的自制加一我倒是蛮推荐的,应该字符型主键可以应付很多我们意想不到的情况。
第五:GUID主键(UUID)
目前一个比较好的主键是采用GUID,当然我是推荐主键还是字符型的,但值由GUID生成,GUID是可以自动生成,也可以程序生成,而且键值不可能重复,可以解决系统集成问题,几个系统的GUID值导到一起时,也不会发生重复,就算有“o”老数据也可以区分,而且效率很高,在.NET里可以直接使用System.Guid.NewGuid()进行生成,在SQL里也可以使用 NewID()生成。优点是:
同 IDENTITY 列相比,uniqueidentifier 列可以通过 NewID() 函数提前得知新增加的行 ID,为应用程序的后续处理提供了很大方便。
便于数据库移植,其它数据库中并不一定具有 IDENTITY 列,而 Guid 列可以作为字符型列转换到其它数据库中,同时将应用程序中产生的 GUID 值存入数据库,它不会对原有数据带来影响。
便于数据库初始化,如果应用程序要加载一些初始数据, IDENTITY 列的处理方式就比较麻烦,而 uniqueidentifier 列则无需任何处理,直接用 T-SQL 加载即可。
便于对某些对象或常量进行永久标识,如类的 ClassID,对象的实例标识,UDDI 中的联系人、服务接口、tModel标识定义等。
缺点是:
GUID 值较长,不容易记忆和输入,而且这个值是随机、无顺序的。
GUID 的值有 16 个字节,与其它那些诸如 4 字节的整数相比要相对大一些。这意味着如果在数据库中使用 uniqueidentifier 键,可能会带来两方面的消极影响:存储空间增大;索引时间较慢。
我也不是推荐GUID最好,其实在不同的情况,我们都可以采用上面的某一种方式,思考了一些利与弊,也方便大家在进行设计时参考。这些也只是我的一点思考而已,而且可能我知识面限制,会有一些误论在里面。
相关推荐
利用GPAC生成MP4文件
GPAC主要针对学生和内容创作者,代表了一个跨平台的多媒体框架,开发人员可以使用它在 LGPL 许可下制作开源媒体。GPAC多媒体框架兼容范围广泛的流行文件类型,从常见格式(如 AVI、MPEG 和 MOV)到复杂格式(如 MPEG-4 系统或 VRML/X3D)和 360 电影。
数据库主键设计之思
有些朋友可能不提倡数据库表必须要主键,但在我的思考中,觉得每个表都应该具有主键,不管是单主键还是双主键,主键的存在就代表着表结构的完整性,表的记录必须得有唯一区分的字段,主键主要是用于其他表的外键关联,本记录的修改与删除,当我们没有主键时,这些操作会变的非常麻烦。 主键的必要性: 有些朋友可能不提倡数据库表必须要主键,但在我的思考中,觉得每个表都应该具有主键,不管是单主键还是
大疆mini 3 pro rtmp推流(带屏遥控器不支持)windows
大疆mini 3 pro无人机rtmp推流(带屏遥控器不支持)至windows电脑
数据库主键选取策略
<!--google_ad_client = "pub-3410656662926364";google_ad_width = 300;google_ad_height = 250;google_ad_format = "300x250_as";google_ad_type = "text_image";//2006-11-18: blog.sqlsky.comgo
WorkBuddy Skill赋能HYSYS与Comsol:AI工作台下的仿真自动化实践
AI Agent正将工业软件自动化带向新高度。在工程仿真领域,流程模拟与多物理场分析常因重复性操作而效率低下,Aspen HYSYS的批量工况调整、Comsol的参数扫描与网格重构均属此类。WorkBuddy这类AI工作台通过Skill将软件二次开发能力封装为可插拔技能包,利用HYSYS的COM/OLE接口和Comsol的Java API,实现自然语言指令到自动化执行的转变。其技术价值在于降低自动化门槛、沉淀工程经验,并支持日志审计与异常重试。在实际应用中,无论化工流程的灵敏度分析,还是激光焊接、移动网格等
全球气候模式降尺度方法总结及其代码实现
简介总结各类型气候模式降尺度方法
数据库设计中如何选择主键 (自然键或代理键 )| Part 1
在 “选择主键”的第一部分中,我们探讨了自然主键和代理主键,并考虑了什么因素决定选择哪一种。决定一开始使用自然键还是代理键是很重要的,因为你选择哪种主键也将有助于解答一些后续问题,特别是使用代理键。
上位机图像处理和嵌入式模块部署(开篇)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 图像处理是现实生活当中很实用的一门技术。工业上一般采用的是机器视觉,以传统算法和光源控制为主,部分采用了深度学习技术。而生活当中,则主要以二维码识别、人脸识别、车牌识别和ocr识别为主,这中间深度学习与AI扮演了很重要的角色。过去,市场上的商业收费软件,主要还是以传统设备厂商提供的上位机软件为主,那这一部分是不是结合最新的npu技术,应该做出一些新的东西出来呢?
(收藏)小议数据库主键选取策略(转)
我们在建立数据库的时候,需要为每张表指定一个主键,所谓主键就是能够唯一标识表中某一行的属性或属性组,一个表只能有一个主键,但可以有多个候选索引。因为主键可以唯一标识某一行记录,所以可以确保执行数据更新、删除的时候不会出现张冠李戴的错误。当然,其它字段可以辅助我们在执行这些操作时消除共享冲突,不过就不在这里讨论了。主键除了上述作用外,常常与外键构成参照完整性约束,防止出现数据不一致。所以数据库在
Android面试必考问题:Android性能优化最全面试题及参考答案(8万字长文)
Android 中的 OOM(Out Of Memory,内存溢出)异常是指应用程序在运行过程中,由于申请的内存空间超过了系统所能提供的最大内存限制而导致的错误。在 Android 中,内存泄漏是指应用中的某些对象在不再被使用后,仍然被其他对象持有引用,导致这些对象无法被垃圾回收器回收,从而占用内存空间,随着时间的推移可能会导致应用内存不足,甚至崩溃。在一次开发 Android 应用的过程中,我发现应用在长时间运行后会出现内存占用过高的情况,导致应用变得卡顿,甚至可能会被系统强制关闭。
基于RK3588边缘计算平台的人数统计系统设计与实现
针对人数统计场景优化的YOLOv5模型完整的模型转换和部署流程高效的嵌入式推理优化方案低成本、低功耗的部署方案实时性强,满足工业应用需求可扩展性好,适配多种应用场景引入注意力机制,提高小目标检测能力结合多模态信息,增强系统鲁棒性开发可视化管理平台,提升用户体验随着边缘计算和AIoT技术的快速发展,基于深度学习的智能视觉系统必将在更多领域发挥重要作用。本项目为相关应用的开发和部署提供了有价值的参考,为推动人工智能技术的产业化应用做出了积极贡献。
主键的选择
主键的选择: 1.有意义的键和无意义的键: 有意义的键:例如身份证号。键值是唯一的,而由人来指定是不可靠的,有可能会出现重复,虽然数据库可以检测出来,但是在数据进入系统之前不会被发现。所以有意义的键是不可靠的。 无意义的键:本质是数据库构造的并不打算供人使用的一个随即数。对应小系统或稳定的情况,应优先考虑。 2.简单键和组合键: 组合键:在一个表和另一个表上下文相关时更易于使用。比如:订
手把手教你学simulink(57.2)--电励磁同步电动机场景示例:基于Simulink的矢量控制(Field-Oriented Control, FOC)电励磁同步电动机
在某电动汽车驱动系统中,采用了本项目开发的带有矢量控制功能的电励磁同步电动机驱动系统,结合三相逆变器实现了对电动机的高效控制。在某工业驱动系统中,采用了本项目开发的带有矢量控制功能的电励磁同步电动机驱动系统,结合三相逆变器实现了对电动机的精确控制。经过实际测试,该系统的应用使得生产效率提高了10%,并且在高负载条件下,电动机的温升得到了有效控制,延长了电动机的使用寿命。通过本项目的实施,我们成功配置了三相交流电源、三相逆变器和电励磁同步电动机的参数,并实现了对电动机的精确控制。
navicat for mysql自增_mysql,navicat怎么设置主键自增
Navicat是应用比较多的mysql的视图管理工具。下面记录下Navicat如何设置主键自增的操作。1.找到需要操作的表右键找到设计表2.找到对应的字段、改为int型、在下面会出现自动递增的勾选,勾上即可(注意,数据类型一定要是int型的)扩展资料主关键字(primary key)是表中的一个或多个字段,它的值用于唯一地标识表中的某一条记录。在两个表的关系中,主关键字用来在一个表中引用来自于另一...
Outlook Express 6 (OE6) for Win7/Win8/Win10
英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。
OV9734 DATASHEET,完整规格书
OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等
mysql 专业 类型_MySQL 常用字段类型,介绍及其建表使用方法经验分享
text型表达范围就是65535字节,一般用来存商品描述,等字符数比较多的等,它也有4种TEXT类型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT,存储容量不同,含有字符集。blob型以二进制形式存储数据,是的可以存储图片。度出去依然是图片。decimal型DECIMAL列的声明语法是DECIMAL(M,D), M是数字的最大数(精度)。其范围为1~65(在较旧的MySQL版...
jdk-8u144-linux-x64.tar.gz.
该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包
hive导数据到mysql 自增主键出错_面试官:MySQL表设计要注意什么?
本文公众号来源:孤独烟作者:孤独烟引言这篇文章的很多问题,都是面试中实打实会问到的!比如OK,具体有下面这些问题1、为什么一定要设一个主键?2、你们主键是用自增还是UUID?3、主键为什么不推荐有业务含义?4、表示枚举的字段为什么不用enum类型?5、货币字段用什么类型?6、时间字段用什么类型?7、为什么不直接存储图片、音频、视频等大容量内容?8、字段为什么要定义为NOT NULL?其实...
廖雪峰Python教程[完整版]
廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白
drawDB表设计高级技巧:字段类型与约束配置
还在为数据库表设计而头疼?面对复杂的字段类型选择和约束配置感到迷茫?drawDB作为一款强大的可视化数据库设计工具,提供了丰富的字段类型支持和灵活的约束配置功能。本文将深入解析drawDB在表设计方面的高级技巧,帮助你构建更加健壮和高效的数据库结构。 ## ???? 字段类型体系深度解析 drawDB支持多种数据库类型,每种类型都有其独特的字段类型体系。了解这些类型的特点和适用场景是高效设计的关键...
mysql ddl过程,MySQL基础教程3-DDL(创建表)
注意: 撰写本文目的主要是为了给自己做一个备忘录,如果你学过Mysql并且希望从本文中找到一些忘记的知识点,那么你可以阅读本文章。由于文章内讲解并不是很多,因此此文章并不适合小白入门使用。DDL-创建表所谓建表,就是一个声明字段的过程列选什么类型,列选什么属性简单建个表:create table people(-> age int,-> name varchar(10)-> );...
python field怎么理解_django中models之field详解
在model中添加字段的格式一般为: field_name = field_type(**field_options)一 field options(所有字段共用)1 null 默认为False,True则表示可以为null。(空字符串在数据库中可能被存储为'')2 blank 默认为False,True表示可以为空。3 choice 可选的,限制了该选项的字段值必须是所指定的c...
数据库设计
本文主要是基于跟DBA往来邮件中内容以及实际开发过程中的经历,用文字记录一下设计开发感悟。 1.设计数据库之前一定要对业务了如指掌,任何业务的边边角角都要读到,杜绝出现业务盲区; 2.需求本身的不确定不能影响数据库设计本身,即数据库设计必须最低满足3范式等一些数据库设计本身的一些基本约束; 3.字段类型长度选择定论应该以业务的可拓展为目标,例如数据字典树结构数据(000000,000100,...
解决:Cause: java.lang.IllegalArgumentException: argument type mismatch异常报错问题
完整的报错为:"nested exception is org.apache.ibatis.reflection.ReflectionException: Could not set property 'id' of 'class com.ldy.eduservice.entity.EduTeacher' with value '1450640362735951873' Cause: java.lang.IllegalArgumentException: argument type mismatch",
mysql设计过程中要考虑哪些要素
4、选择合适的字段类型和字段长度。
Oracle数据库的学习
1)字段方式:VARCHAR2(50) 、NUMBER、DATE、INTEGER、 CHAR(10) 2)时间默认值:OPRTIME DATE DEFAULT SYSDATE NOT NULL ; CALL_TIME datetime DEFAULT getdate() NOT NULL, 3)建立索引:create index IDX_ACCOUNTCHANGE
SQL语句之表操作
SQL语句系列 1、SQL语句之行操作 2、SQL语句之表操作 3、SQL语句之数据库操作 4、SQL语句之用户管理 写在前面 在上一篇博文里面我整理了“行”级别的操作,分别是“增(insert)、删(delete)、改(update)、查(select)”,这篇文章继续整理“表”级别的操作,同样分为“增(create table)、删(drop ...
数据库怎么才能设计的更漂亮
但如果某个字段直接定义成NOT NULL,万一有些地方忘了给该字段写值,就会insert不了数据。这也算合理的情况。但有一种情况是,系统有新功能上线,新增了字段。上线时一般会先执行sql脚本,再部署代码。由于老代码中,不会给新字段赋值,则insert数据时,也会报错。由此,非常有必要给NOT NULL的字段设置默认值,特别是后面新增的字段。
1773



被折叠的 条评论
为什么被折叠?



