最佳数据库设计

使用LiveAndroid进行应用测试 在"存储"设置中,选择"使用现有的虚拟硬盘文件"并浏览选择之前下载的LiveAndroid镜像文件。LiveAndroid是一个基于Android-x86的开源项目,它提供了一个完整的Android操作系统的镜像,可以在PC上运行。使用LiveAndroid可以方便地在虚拟机或物理计算机上进行Android应用的测试,而无需在真实的Android设备上进行。对于其他选项,您可以根据需要进行调整。LiveAndroid提供了一个方便的环境,使您能够在PC上进行应用测试,并验证应用的功能和稳定性。 阅读详情

1,主键
 自增长主键,如ORACLE的序列或是UUID算法或是自己制作一个生成唯一数字的类,主键无意义性。
 避免用复合主键。
 双主键,即一个无意义的ID字段作主键,如用序列。另一个则是业务编号NO作为主键(如产品号,用户代码等。)因为如ORACEL只能有一个主键,这个则是一个UNIQUE KEY。在不能完全确定业务NO的意义时,定义成VARCHAR2,当然这可能影响性能。

 对于业务编号NO,不作为主键,主要有如下原因:用一个序列“数字型”作为主键,性能更好。二是对于业务编码可能存在编码规则在运行后期会有变化,以及长度估计不准等。特别比如用身份证作为主键就有很多问题,比如在以前15时都是数字,就设计成NUMBER(15),可是当增加到18位时,长度不够,更糟糕的是18位身份请中可能存在字母。数据类型改变是一个更大的问题。又如,对于定单,订单编号在刚开始的时候我们一切顺利,后来客户说“订单可以作废,并重新生成订单,而且订单号要保持原订单号一致”,这样原来的主键就面临危险了。
 双主键还有一个借助操作系统的设计,删除一个PETER的用户,后来又来一个PETER,则这两个人应该是有不同的权限(在授权表中)。可是如果授权表以用户NO作为关联用户的键,则后来的人就有了原来那个人的权限了,是不对的。(这里也说明了下面会提到的,在不是万万确定的情况下,不要设置外键,或是说删除等的限制,对于外键的应用,是一个可以研究的问题。)
 复合主键在作自动处理,如页面批量删除等或是编码公用性上就不方便了。当然性能也没有单主键好。如果使用Hibernate等O/R工具的话,参考其映射例子,对于简单的单为了表达多对多的关系,则只有两个相对就表的ID,则此表无其它意思,可以不需要上面提到的无意义的ID作为主键了。但这种较少,看定单/定单条目/产品的例子中,将产品条目作为定单的SET/LIST实现的话,好像定单条目中则不能加id标识了。(不过,作为业务表设计应该是主,而HIBERNATE应该是末了,不推荐使用HIBERNATE来推动业务数据库设计了。因此,HIBERNATE中的id标识主要是作为HIBERNATE的标识,与我上面的讲到的表设计中的ID是可能分开的,只不过对于上面提到的情况,刚好可以很好的配合吧。此种情况下,我们如果用HIBERNATE,也可以将ID字段作为LIST/SET的composite-element一个属性property来处理,只是不能利用Hibernate class id标识的generator而已,即在插入时要自己赋值,也可以编程中取得如sequence或UUID等,保持数据库层的一致性)


 对主键的选择:一是业务编号作主键,会有如上提到的问题。二是无意义自动编号,如序列SEQUENCE。三是MAX加一,有时用业务编号也是如此。如果直接用本表来实现,max(NO)+1,当数据增加后,会严重影响性能。四是自制加一,是对MAX加一的一种改进实现,用一表编号控制档NO_CTRL来实现的。在后面会谈到,这也是一个比较可研究的命题。主要用来生成业务编码,且带有业务编码规则。五是UUID/GUID,因为UUID/GUID也是无意义,且无序的,并且更长,相对于SEQUENCE来说,是没有优势的。(不过也有特殊情况,是否需要所有的表或部分表的主键唯一,如在一次设计的统一的审核流程,审核规则的时候,则以定单,采购单等的一主键ID作为审核表的外键) 如在Hibernate中则可以定制就很好。


2,命名
 表,字段,视图等都以'_'下划线分隔各个意义单词,这样方便从数据持久向对象的转换,参照JAVA命名规则,这样例如用JB或自己写程序转换则以'_'分隔组成JAVA属性首字母大小写等。
 表名/视图名按你的业务模块或是'T'/'V'等为前缀加以区分。

 从持久到对象类型,table到java 类的转换最好全部规则一致,(除非生成JAVA后可能还需要增加 编程中用的属性),最好的方法是用工具生成,如用JB生成CMP一样。当然如用HIBERNATE则也可能是反向的,由JAVA类设计(UML),利用xDoclet等生成hbm.xml,再根据hbm.xml导出数据库DDL。
 这种完全规则一样,可能对于在利用如反射等作编码完成所有的表的某一功能时很有用。

3,一般在设计时所有表都应该有如下字段(除小数配置性表,如下面提到的no_ctrl,在你不确定时也可以加上,先不用即可),
 ID:NUMBER 主键
 NO/复合字段:业务主键(唯一KEY)
 CREATE_USR:创建人(NOT NULL)
 CREATE_TIME:创建时间(NOT NULL)
 MODIFY_USR:最后修改人
 MODIFY_TIME:最后修改时间
 DELETE_FLAG:0/1,T/F,TRUE/FALSE 删除标志(default 'F' NOT NULL)
 DELETE_USR:删除人
 DELETE_TIME:删除时间
 VERSION:NUMBER default 1 版本(NOT NULL)
 在设计时可能还没有要求到删除时只作标记,而是直接删除,可能是客户还没想到或提出。但作设计人员是应该想到可能的扩展的。用户乐观锁定的VERSION也一样,可能在开始时还没有用到,但也应是一种选择锁定的方法的。
 可以选择以上的时间/版本等是采用编程来实现(应用层来赋值)或是采用数据库层的TIRGGER来实现。
 
 在设计字段时,最好想想是否有DEFAULT值。加上注释,特别是如DELETE_FLAG这样的字段。

4,字段类型(还没写,主要指如时间类型,有的是用char(8)20010101 或char(10)2001-01-01等。不有标志,如状态,类型等,是用char还是number呢?(请大家发表这对于数据库层及编程方便性上给个意见。)

5,对于业务编码或是自制编号加一的设计及思考。

 如上提到可以用自制编号加一来设计主键。但同时也讲到最好是别设一无意义的纯主键。所以一般是用自制来设计“业务编号”,因为业务编号可能有前后缀,且一般要求顺序,连续等。所以如下主要探讨一下业务编码的问题:
 a,编号连续问题,使用MAX + 1,如果在执行INSERT语句时,直接使用则一定保证多用户连续。即INSERT INTO IN_BOX VALUES(MAX(IN_NO)+1,...)。如果有前后缀,如果规则一定,也可以使用如ORACLE的SUBSTR等来实现。如果在编程中是先用一个SELECT MAX(IN_NO)...,再执行INSERT,则会出现多用户时后者重复的情况。使用此更大的问题是上面讲到的性能问题,所以不推荐。
 b,使用自制一个NO_CTRL表来保存(注:如ORACLE的序列在内部据说也是如此来实现的),基本的NO_CTRL是这样的,NO_CTRL(ID,TABLE_CODE,COLUMN_CODE,CURR_NUM)。基本作法是在完成插入时加1。(可能对于你的设计中某个表存的数据是单据,单据基本数据项一样,可是不同种类的单据编号不同,各自连续时,则此表要作相应修改,如果要满足类似所有情况可能得更多思考了)。一般会有一个专门的类来完成取得NO的功能。
 c,对于某些业务,特别是ERP中的单据等,是在用户录入界面时就得显示单据号,这个问题比较复杂。最简单的是页面生成下一个NO,用noCtrl.nextNo(table,column),页面和其它录入项一样传入后台进行数据新增。noCtrl的nextNo的实现是select curr_no+1,update curr_no+1,即取回并加一更新。此方法有很严重的问题是就算是单用户也不能保证业务编号连续,因为在取回时就更新了,如果业务执行新增出现异常,则此编号则浪费了。所以应该对此方法加以改进,主要是采用“延迟更新”来实现。即nextNo()方法是只执行查询,返回下一个编号,显示在页面上,在后台执行业务新增时,在一个事务中,执行更新加一的动作。注意考虑多用户的情况,业务新增中要重新执行取得号码(因为在你执行取回号到执行新增中间可能已被另一用户更新了,你的编号已被使用了)。所以你的业务新增会是这样的,tx.begin(),ctrlNo.nextNo(table,column),insert(业务),ctrlN.update(),tx.end().对于ctrlNo.update()为了更进一步保证一致,可以带上where currNo=currNo。如是乐观锁加version一样。同时可能存在取加一个号要连续用多个的情况,最好则采用加锁读取来实现。
 d,上面主要是讲到业务编号的连续,是数字。但一般业务编号并不只是数字,而是一个有前后缀,且按一定规则生成的。所以采用NO_CTRL也是很好的。这样可能会是这样的,NO_CTRL(ID,TABLE_CODE,COLUMN_CODE,PREFIX,POSTFIX,CURR_NUM,NUM_LEN)。即加上前,后缀规则和数字号长度。

MQTT(轻量级消息中间件)基本使用指南 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是一种轻量级的发布 / 订阅模式(Pub/Sub)消息传输协议,专为低带宽、不稳定网络环境设计,广泛应用于物联网(IoT)、移动设备、传感器网络等场景(如空气净化器、智能家居设备的远程控制)。Eclipse Mosquitto 是一款轻量级、开源的 MQTT 消息服务器(Broker),由 Eclipse 基金会维护,专为低资源消耗和易用性设计。 阅读详情

相关推荐

金融科技数据源

数字金融开放研究平台

平平淡淡,戒急用忍,一生学闭嘴。 1758

关于编号/编码命名的问题

文章目录概述订单号命名 概述 银行卡账号、员工编号、分店编号、单据编号、单据流水号、部门编号,基本都是用 Number 命名,缩写 NO。 分析:在实际的业务中,很多以 Number 命名的编号里面通常只有阿拉伯数字,没有其它字符(英文字母、特殊字符等) 用户编码、部门编码、岗位编码、分店编码、区域编码、国家编码,基本都是用 Code 命名。 分析:在实际的业务中,很多以 Code 命名的编码里面通常允许出现数字以外的字符(例如:英文字母、下划线等),所以数据类型往往是 varchar 类型,而且编码内容往

liaowenxiong的博客 2288

接口调试必看:status显示canceled的3种常见原因及修复方法

本文深度解析了接口调试中status显示canceled的三种核心原因:网络层中断(如请求超时)、应用层逻辑主动取消(如请求竞态、组件卸载)以及用户交互与浏览器行为。文章提供了从诊断到修复的系统性方案,包括分析Network Timing、使用Axios CancelToken、优化请求策略与性能,帮助开发者从根本上解决这一常见问题。

bb456的博客 936

主键(PrimaryKey) 复合主键 用一个无意义 的字段做主键将会更加有利于系统的可扩展性

1.2.6 主键(PrimaryKey) 员工表中的每一行记录代表了一个员工,一般员工的名字就能唯一标识这一个员工,但 是名字也是有可能重复的,这时我们就要为每一名员工分配一个唯一的工号: 工号 姓名 部门 入职时间 001 马小虎 产品开发部 2003年5月22 日 002 王二小 技术支持部 2005年7月17 日 003 白展堂 后勤部 1998年3月27 日 004 钱长贵 销售部 200

autumn20080101的专栏 1835

多传感器标定全栈系统学习教程

无论是激光雷达(Lidar)、毫米波雷达(Radar)、相机(Camera)还是惯导(IMU),传感器之间的精确标定直接决定了系统的可靠性与性能。本文将以系统化的视角,梳理多传感器标定的核心知识体系,并分享一套覆盖全栈技术的学习路径。Calibration)是实现点云与图像融合的前提,而雷达与车辆的标定(Radar2Car)则是精准速度估计的关键。:Lidar2Car、Camera2Car的快速标定流程,标定板布置规范。:从单传感器标定入手(如相机内参),逐步过渡到多传感器联合标定。

weixin_41792788的博客 904

ArchLinux下用Wine运行钉钉全攻略:从字体配置到中文输入法避坑

本文详细介绍了在ArchLinux系统上使用Wine运行钉钉的完整配置流程。从最新的WoW64架构环境准备、中文字体配置与DPI优化,到钉钉安装、关键系统库替换,再到解决中文输入法失效等核心难题,提供了实战避坑指南。旨在帮助Linux用户在企业办公场景下,获得接近原生的稳定使用体验。

alice7model的博客 588

设计一个工具类:通过切面的方式扫描所有的入参和出参,动态去除所有无意义的字段,只返回有用字段?

需求原型:在日常的开发过程中,我们为了开发规范,为了不 思路图: 有兴趣或者能力强的朋友可以一起做!

zhaoliubao1的博客 415

基于STM32F4通用定时器实现Livox激光雷达PPS硬件同步的工程实践

本文详细介绍了基于STM32F4通用定时器实现Livox激光雷达PPS硬件同步的工程实践。通过分析PPS信号的时序要求,对比不同定时器的特性,并提供完整的代码实现与调试技巧,帮助开发者解决多传感器数据融合中的时间同步问题。实测表明,该方案在车载环境中稳定运行超过2000小时。

weixin_30540691的博客 325

关于无意义的主键

数据库中使用无意义的主键(比如流水号)比较方便  但生产环境下必须要注意业务量大的时候会出现问题 所以要设置增长类型和循环类型 增长类型 (主键是如何增长的) 1 常规类型   规定一个自增最大值 从起始值(如1)开始 一直递增到 最大值(如 99999999)为止 2 物理日期类型 3 业务日期类型 4 自增长常规类型 5 自增长物理日期类型 6 自增长业务日期类型 循环类型(

Slark的博客 1696

华为OD机考2025C卷 - 高矮个子排队(Java & Python& JS & C++ & C)

华为OD机考2025C卷 - 高矮个子排队。提供在线OJ刷题。Java、C++、Python、C语言、JavaScript题解,并提供完整思路讲解。

算法大师! 1682

【Python爬虫(1)】专栏开篇:夯实Python基础

要想熟练掌握 Python 爬虫技术,扎实的 Python 基础是必不可少的。这就好比建造高楼大厦,Python 基础就是那稳固的基石。只有打好了这个基础,我们才能在爬虫的学习道路上稳步前行,理解并运用各种爬虫技术和框架。

邓邓子的博客 2026

没有设置数据库字段ID属性为UNSIGNED的代价

今天下载了一个网易云课堂的源码,糊里糊涂的自己建立了数据库表,忘记了设置ID为UNSIGNED。结果导致命名登录正常,但是页面反复的跳回登录页面,检查了半天依然没有得到答案,最终在数据表的创建 上找到了答案。原来管理员ID应该是正整数,在没有设置UNSIGNED属性的情况下,则默认的管理员ID成了零,这个时候 我们再去登录判断session的时候遇到了下面的语句: if(!session('i

geoeroil的博客 3158

【光子AI / Photon.AI】manus 通用 Agent 的实现核心技术原理与应用

摘要 Manus是一款由国内团队开发的通用AI Agent,其核心技术原理基于多智能体协作架构、云端全能沙箱、规划-执行-反思循环等系统工程方法。与传统的对话式AI不同,Manus能够在独立的Linux虚拟机环境中自主规划并执行复杂任务,通过编写和运行代码来解决问题,具备强大的纠错能力和工具使用能力。 核心应用场景包括深度行业研究、自动化办公、生活助理、辅助编程和跨平台信息整合等。Manus的工程化落地优势体现在沙箱环境、多智能体调度和容错机制等方面,使其能够完成需要多步骤操作和多种工具调用的复杂任务,将A

AI天才研究院 667

x86版Android OS LiveAndroid

LiveAndroid下载地址 [url]http://code.google.com/p/live-android/downloads/list[/url] [img]/upload/attachment/126302/ecb15bf3-18d9-3e33-a5d7-d3412ceb1b20.jpg[/img] [img]/upload/attachment/126304/1281...

ferfia的专栏 298

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

vm virtualbox_使用VirtualBox在PC上安装Android OS

vm virtualbox Google的Android是用于移动设备的操作系统和软件堆栈。 在后台,它使用Linux内核的定制版本。 Android是目前增长最快的移动操作系统,并引起了极大的轰动。 如果您对此感到好奇,可以尝试一下,而不必购买Android智能手机。 让我告诉你怎么做。 (您也可以在此处查看我们在Android上的介绍性文章) LiveAndroid是一个项目,为在x86平...

cunhui1209的博客 383

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Intel发布Android模拟器的x86系统映像

Intel 刚刚为 Android 4.0 的 Android SDK 和模拟器发布了等待已久的 x86 系统映像。这个映像可以让 Android 模拟器在 Intel x86 架构的计算机上以原生的速度运行。你可以很方便的安装这个映像,只需刷新 SDK Manager 并在 Android 4.0.3 列表中选择对应项目即可。 更好的工具可以开发出更好的 App,希望此工具能帮到你更快速的开发...

weixin_30294709的博客 208

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

使用VirtualBox在PC上安装Android OS

Google的Android是用于移动设备的操作系统和软件堆栈。 在后台,它使用Linux 内核的定制版本。 Android是目前发展最快的移动操作系统,并引起了极大的轰动。 如果您对此感到好奇,可以尝试一下,而不必购买Android智能手机。 让我告诉你怎么做。 (您也可以在此处查看有关Android的介绍性文章) LiveAndroid是一个项目,为在x86平台上运行的Androi...

629

Live-Andorid Projects

http://code.google.com/p/live-android/ Welcome to LiveAndroid, a LiveCD for Android running on x86 platforms. Want to give Google Android a try, but don't feel like buying a T-Mobile G1/G2/G3? LiveA

zxg519的专栏 560

Live-Andorid Projects_拔剑-浆糊的传说_新浪博客

http://code.google.com/p/live-android/ Welcome to LiveAndroid, aLiveCDfor Android running onx86 platforms. Want to give Google Android a try, but don't feel like buying a T-Mobile G1/G2/G3? L...

拔剑—浆糊的传说 80

usb stick

android x86 usb stickhttp://www.tomshardware.com/news/LiveAndroid-LiveUSB-Android-OS,8381.html chromium os usb stickhttp://chromeos.hexxeh.net/

suxinmin的专栏 695

关于业务编号相关问题

在开发中业务编号问题恐怕是最常见的了,比如如何编号,编号如何使用,还有如何保证并发的效率并且不重复。 首先是如何编号,其实关于业务编号最常见的误解是必须严格遵守一定的编号规则,编号中各个部分都有严格的含义,从编号中可以看出一些内容来。实际上也是如此,业务人员对于编号的要求比研发人员要高,有时很依赖编号规则。不过呢,因为随着业务的变化特别是时间的推移,有时业务编号不再能严格遵守当时的含义,比如我们

luckysunny745的专栏 3424

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

要努力去发光,而不是被照亮~ 126

Spring Boot 数据源与 MyBatis(-Plus) 自定义配置详解

本文详解 Spring Boot 中单数据源环境下 HikariCP 与 MyBatis-Plus 的自定义配置。通过手动声明 SqlSessionFactory,实现下划线转驼峰、日志输出、一级缓存策略等精细化控制。结合 HikariCP 核心参数调优(如最大连接数、连接生命周期),确保高性能与稳定性。适用于仅需访问单一数据库的场景,避免多数据源复杂性,兼顾性能与可维护性。

BADAO_LIUMANG_QIZHI的博客 196

Docker Compose:搭建本地多服务开发环境

从一个 Java API、PostgreSQL 和 Redis 开始,配置服务名、端口、环境变量、健康检查、数据卷和依赖关系。理解 Compose 文件如何被解析、项目如何隔离,以及哪些数据不能依赖“重建容器”保留,能够把个人开发环境整理成团队可复用的启动入口。

m0_62221377的博客 453

AI全栈实战 | 3.9-01 爬虫入门:requests 加 BeautifulSoup 三分钟跑通,但 90% 的人栽在这 4 个“礼貌“问题上

⚠️:本文内容仅用于。请遵守目标站点的服务条款与相关法律法规,不得对目标服务造成负担,不得采集、传播个人隐私数据。技术是中性的,边界在你手里。爬虫的入门技术(requests 发请求 + BeautifulSoup 解析)三分钟就能学会。真正区分"会用爬虫"和"会做爬虫的人"的,是这篇我们跑通"请求→解析→存储"的最小闭环,然后重点把"合规与礼貌"这根弦给你绷上。

源码获取 | 运行部署 | 定制二开修改,如果回复不及时请耐心等待,请见谅。 405

数据库主键选型指南:BIGINT vs VARCHAR

主键选型关乎数据库性能与架构演进。BIGINT(如雪花算法)在顺序写入、二级索引开销和分布式生成上优势显著,适合高并发核心链路;而传统 VARCHAR UUIDv4 因随机性导致频繁页分裂、存储膨胀,性能堪忧。UUIDv7 通过时间戳有序性实现高效追加写入,结合 BINARY(16) 存储可兼顾性能与安全,成为现代微服务新选择。关键在于:主键应稳定、无业务含义,优先选用趋势递增的紧凑类型,并根据场景合理采用双主键模式或 ULID 等替代方案。

小李同学的博客 300
上一篇: 分级分段的金额转中文大写的方法
下一篇: 一个数据库序号类NoCtr类的实现
eKurt
博客等级 码龄21年 0粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值