A、表中应该避免可为空的列
B、表不应该有重复的值或者列
C、表中记录应该有一个唯一的标识符
D、数据库对象要有统一的前缀名
E、尽量只存储单一实体类型的数据
A、消灭重复数据。
B、避免编写不必要的,用来使重复数据同步的代码。
C、保持表的瘦身,以及减从一张表中读取数据时需要进行的读操作数量。
D、最大化聚集索引的使用,从而可以进行更优化的数据访问和联结。
E、减少每张表使用的索引数量,因为维护索引的成本很高。
规范化的优点是减少了数据冗余,节约了存储空间,相应逻辑和物理的I/O次数减少,同时加快了增、删、改的速度。但完全规范化的设计并不总能生成最优的性能,因为对数据库查询通常需要更多的连接操作,从而影响到查询的速度,而且范式越高性能就会越差。出于性能和方便管理的考虑,原则上表设计应满足第三范式。有时为了提高某些查询或应用的性能而可以破坏规范规则,即反规范化。
数据应当按两种类别进行组织:频繁访问的数据和频繁修改的数据。对于频繁访问但是不频繁修改的数据,内部设计应当物理不规范化。对于频繁修改但并不频繁访问的数据,内部设计应当物理规范化。比较复杂的方法是将规范化的表作为逻辑数据库设计的基础,然后再根据整个应用系统的需要,物理地非规范化数据。
根据应用的实际需要和特点,可以将数据表进行如下分类:
基本数据表:描述业务实体的基本信息。例如,人员基本信息、单位基本信息等。
标准编码表:描述属性的列表值。例如,职称、民族、状态等。
业务数据表:记录业务发生的过程和结果。例如,人员调动登记、变更通知单等。
系统信息表:存放与系统操作、业务控制有关的参数。例如,用户信息、权限、用户配置信息等。
统计数据表:存放业务数据统计值。例如,通知单统计、人员类别统计等。
临时处理表:存放业务处理过程中的中间结果。
其他类型表:存放应用层的日志、消息记录等。
(1)一般来说,应该使用能正确存储和表示数据的最小类型。如果不确定需要什么数据类型,则选择不会超出范围的最小类型。
(2)选择更简单的数据类型。例如,比较整数的代价小于比较字符,因为字符集和排序规则使字符比较更复杂。
(3)尽可能把字段定义为NOT NULL。对于字段能否NULL,应该在SQL建表脚本中明确指明,不应使用缺省。
(4)一个表中的字段不要太多,理论上不要超过80个。
(5)数据库中所有布尔型中数值0表示为假;数值1表示为真
(6)当字段定义为字符串类型时使用VARCHAR2而不用NVARCHAR
(7)字段尽可能有默认值,字符型的默认值为一个空字符值串,数字型的默认值为数值0。
(1)为关联字段创建外键。
(2)所有的键都必须唯一。
(3)尽可能避免使用复合键。
(4)外键总是关联唯一的键字段。
(5)尽可能使用系统生成(如序列SEQUENCE产生)的主键。
(6)可选键有时可做主键。
(7)一个表中组合主键的字段个数尽可能少。
(1)如果一列出现在表达式或函数中,不会使用该列上的索引
(2)要索引外键
(3)对于索引选择性高的列使用B-Tree索引
(4)对于索引选择性低的列使用位图索引
(5)HASH索引只适用于相等比较
(6)不要索引大型字段(有很多字符的字段)
(7)不要索引常用的小型表
如无特别需要,避免使用大字段(BLOB、CLOB、LONG等)。如使用时必须使用BLOB或CLOB类型。
采用数据库系统实现数据的完整性,不但包括通过标准化实现的完整性而且还包括数据的功能性。在写数据的时候还可以增加触发器来保证数据的正确性。不要依赖于应用程序保证数据完整性,它不能保证表之间(外键)的完整性。
每个表要求有主健,主健字段或组合字段必须满足非空属性和唯一性要求。
(1)对于关联两个表的字段,一般应该分别建立主键、外键。实际是否建立外键,根据对数据完整性的要求决定。
(2)根据需要适当设置父表数据修改时对子表的影响:
父表中删除数据:级联删除;受限删除;置空值。
父表中插入数据:受限插入;递归插入。
父表中更新数据:级联更新;受限更新;置空值。
由于NULL值在参加任何运算时,结果均为NULL,所以必须利用NVL()函数把可能为NULL值得字段或变量转换为非NULL的默认值。
对于字段有检查性约束,要求指定CHECK规则。
触发器是一种特殊的存储过程,通过对表的DML操作而触发执行,是为确保数据的完整性和一致性不被破坏而创建,实现数据的完整约束。选择触发器的BEFORE或AFTER事务属性的时候,对表操作的事务属性必须与应用程序事务属性保持一致,以避免死锁发生。在大量修改数据时,尽量避免使用触发器。
为了在数据库和应用程序之间提供另一层抽象,可以为应用程序建立专门的视图而不必非要应用程序直接访问表。这样做还在处理数据库变更时提供了更多的自由。视图是虚拟的数据库表,在使用时要遵循以下原则:
为简化查询,将复杂的检索或子查询通过视图实现。
提高数据的安全性,只将需要查看的数据信息显示给权限有限的人员。
视图中如果嵌套使用视图,级数不要超过3级。
由于视图中只能固定条件或没有条件,所以对于数据量较大或随时间的推移逐渐增多的表,不宜使用视图,可以采用实体化视图代替。
除特殊需要,避免类似SELECT * FROM [TableName] 而没有检索条件的视图。
视图中尽量避免出现数据排序的SQL语句。
在生产环境中,必须严格管理SYS和SYSTEM用户,必须修改其默认密码,禁止用该用户建立应用数据库对象。删除或锁定SCOTT等默认安装但不使用的用户。
必须按照应用需求,设计不同的用户访问权限。包括应用系统管理用户,普通用户等,按照业务需求建立不同的应用角色。用户访问另外的用户对象时,应该通过创建同义词对象SYNONYM进行访问。
确定每个角色对数据库表的操作权限,如创建、检索、更新、删除等。每个角色拥有刚好能够完成任务的权限,不多也不少。在应用时再为用户分配角色,则每个用户的权限等于他所兼角色的权限之和。
应用级的用户帐号密码不能与数据库相同,防止用户直接操作数据库。用户只能用帐号登录到应用软件,通过应用软件访问数据库,而没有其它途径操作数据库。
用户帐号的密码必须进行加密处理,确保在任何地方查询都不会出现密码的明文。
SQL中的字符类型数据应该统一使用单引号。特别对纯数字的字符串,必须用单引号,否则会导致内部转换而引起性能问题或索引失效问题。利用TRIM(),LOWER()等函数格式化匹配条件。
对于非常复杂的SQL(特别是有多层嵌套,带子句或相关子查询的),应该先考虑是否设计不当引起的。对于一些复杂SQL可以考虑使用程序实现。
使用 IN 或 NOT IN 子句时,特别是当子句中有多个值且表数据较多时,速度会明显下降。可以采用连接查询或外连接查询来提高性能。
如果不必要取出所有数据,不要用 * 来代替,应给出字段列表。
不必要的数据排序大大的降低系统性能。
使用INSERT语句一定要给出插入值的字段列表,这样即使表加了字段也不会影响现有系统的运行。
做多表操作时,应该给每个表取一个别名,每个表字段都应该标明其所属哪个表。
SQL语句的编写,变量尽量使用“?”绑定变量。
(1)所有命名采用26个英文大小写字母和0-9这十个自然数,加上下划线_组成。不能出现其他字符(注释除外)。
(2)长度不超过30个字符。
(3)实际名字尽量描述实体的内容,由英文单词、单词组合或单词缩写组成,不以数字和_开头。
(4)命名中禁止使用SQL关键字。
(5)对象名尽量短。
数据库对象包括表、视图(查询)、存储过程(参数查询)、函数、约束。对象名字由前缀和实际名字组成,长度不超过30。
前缀:使用小写字母加下划线
表 tb_
视图 view_
存储过程 sp _
函数 fn_
触发器 trig_
局部变量 l_
全局变量 g_
约定:表名由前缀和实际名字组成。
前缀:使用小写字母tb_,代表表。实际名字中,一个系统尽量采取同一单词,多个后面加_来连接区分。
因此,合法的表名类似如下。
tb_Member
tb_MemberInfo
tb_ForumBoard
表
表名如Order/UserAccout
符合以下规范:
(1)统一采用单数形式,反对Orders
(2)首字母大写,多个单词的话,单词首字母大写,反对order/Useraccout/ORDER
(3)避免中文拼音,反对AgentBaoCi
(4)避免下划线连接,反对User_Accout(下划线适用Oracle数据库)
(5)避免名称过长,反对WebsiteInfomationModifyRecord
(6)多对多关系表,以Mapping结尾,如UserRoleMapping
(7)避免保留字
表以单数形式名词或名词短语命名。如果表名仅有一个单词,那么建议不使用缩写,而是用完整的单词。
主键:PK_<表名>
外键:FK_<表名>_<主表名>_<外键字段名>
索引:IDX_<表名>_<构成索引的字段名>
如果复合索引的构成字段较多,则只包含第一个字段,并添加序号。
字段由表的简称,实际名字组组成。如果此字段关联另外的字段,那么加下划线_连接关联表字段的字段名。
因此,合法的字段名类似如下。
UserID_MeID
UserName
UserRegDate
字段
字段名如userID/userName/userType
符合以下规范:
(1)首个字母小写,多个单词的话,单词首字母大写,反对UserID/Userid
(2)必须有一主键,主键不直接用ID,而是表名+ID,如userID/orderID
(3)常用的字段name,不直接用name,而是表名+Name,如userName/orderName
(4)常用的字段desc,不直接用desc,而是表名+Desc,如userDesc/orderDesc
(5)大写字母前必须包含至少两个小写的字母,反对uID/oID
(6)避免中文拼音
(7)避免下划线连接
(8)避免名称过长
(9)避免保留字
对象
(1)存储过程以SP_为前缀
(2)触发器以TR_为前缀
(3)函数以FN_为前缀
(4)主键以PK_为前缀
(5)索引以IX_为前缀
(6)前缀后的首字母大写,多个单词的话,单词首字母大写,如SP_CountFee
(7)所有的关键字的所有字母必须大写,如SELECT userID,username FROM User
采用有意义的字段名,应该是易于理解,能表达字段功能的英文单词或单词缩写,一般不超过三个英文单词。
系统中所有属于内码的字段(仅用于表示唯一性和程序内部用到的标识性字段),名称取为:ID。
系统中属于是业务范围内的编号的字段,其代表一定的业务信息,字段建议命名为CODE,其数据类型为VARCHAR,该字段需加唯一索引。
字段名不要与表名重复
不要在列的名称中包含数据类型。
字段由前缀和实际名字组成,中间用下划线连接。
前缀:使用小写字母view,表示视图。
因此,合法的视图名类似如下。
view_User
view_UserInfo
约定:字段由前缀和实际名字加操作名字组成,中间用下划线连接。
前缀:使用小写字母sp,表示存储过程。
操作名字:Insert|Delelte|Update|Caculate|Confirm
例如:
sp_User_Insert
约定:所有SQL关键词全部大写。
文章浏览阅读1.2w次,点赞20次,收藏156次。ctions 选项用来定义事件处理方法,用于处理 state 数据。actions 类似于 mutations,不同之处在于 actions 是异步执行的,事件处理函数可以接收 {commit} 对象,完成 mutation 提交,从而方便 devtools 调试工具跟踪状态的 state 变化。..............._vue笔试题
文章浏览阅读1.1w次,点赞2次,收藏23次。isis是一种与ospf很相似的网络协议(属于动态路由协议),它被应用在巨大规模网络,如运营商以及银行等。同样的它也是基于链路状态算法,支持clnp网络,ip网络。与ospf不同的是,它是基于数据链路层报文传输,而ospf则是在ip层进行计算。它可以自动的发现远程网络,只要网络拓扑结构发生了变化,路由器就会相互交换路由信息,不仅能够自动获知新增加的网络,还可以在当前网络连接失败时找出备用路径。无类..._isis协议配置
文章浏览阅读1.9k次。名称:Proxychains – 通过代理服务器进行连接语法:proxychains 描述:这个程序会强制所有使用特定tcp连接的客户端所引起的TCP连接走代理通道。它是一种跳板程序。这个软件和sockscap、premo、eborder异曲同工。2.0版支持SOCKS4、SOCKS5、HTTP类的代理。认证方法:socks-“user/pass”,http-“basic_proxychains是什么
文章浏览阅读550次。sqlserverntext 字段在读取时返回值net.sourceforge.jtds.jdbc.ClobImpl@555bc78f需要在连接数据库的URL后边加上";useLOBs=false"。转载于:https://www.cnblogs.com/rchao/p/4815421.html..._sqlserver text 读取
文章浏览阅读256次。2017职称计算机考试Windows模拟试题习题的练习有利于知识点的复习,下面是小编给大家提供的职称计算机考试Windows模拟试题,大家可以参考练习,更多习题练习请关注应届毕业生考试网。1 Windows"回收站"中不可能有 。答案: DA 文件夹B 硬盘中的文件C 快捷方式D 软盘中的文件2 在windows资源管理器中,当前文件夹为D;\考试,选择其中的文件A.DOC,按住Shift键,用鼠..._在windows10操作环境下,文件命名错误的是
文章浏览阅读967次,点赞10次,收藏19次。语音识别技术(Automatic Speech Recognition)是一种将人的语音转换为文本的技术。_asr算法识别静音是怎恶魔做到的
文章浏览阅读9.3k次,点赞9次,收藏58次。引言调试能力是一个程序员的生存根本,可是很多初学者却忽视调试。今天我们就来讨究一下JS的调试技巧。本文章将会详细列举JS相关的各种实用调试技巧。如果您是JS的初学者,那么这篇文章将对您有很大的帮助。为什么要调试?程序就是函数堆砌起来的,程序的运行就是函数的执行过程。而通过JS调试,我们可以更为直观的追踪到在程序运行中,函数的执行顺序,以及各个参数的变化。这样我们就可以快速的定位到问题所在。1. 什么是JS调试?在程序运行中,我们总会遇到各种bug,而通过代码的追踪代码的运行顺序从而定位到问题的过_js断点调试
文章浏览阅读1k次。记录一次kafka内存溢出,消费慢_kafka消费导致内存泄露
文章浏览阅读933次,点赞12次,收藏29次。数据存储在用户浏览器中设置、读取方便、甚至页面刷新不丢失数据容量较大,sessionStorage和localStorage约5M左右正则表达式是用于匹配字符串中正负组合的模式。在JavaScript中,正则表达式也是对象,通常用来查找、替换哪些符合正则表达式的文本作用:表单验证、过滤敏感词、字符串中提取我们想要的部分const 变量名 = /表达式/其中/ /是正则表达式字面量基于VueCli自定义创建项目架子安装脚手架创建项目。
文章浏览阅读2.1k次。解决方法均来源于论坛,自己把它给整理一下1,因为自己做的界面用到了lineedit,但是发现第一次点击lineedit获得焦点就可以弹出输入法界面,但是再重复点击的时候就不能弹出来了,必须重新获得焦点,于是通过重载重载了QLineEdit的mousePressEvent在mousePressEvent加上一个自定义的信号 emit clicked()重载代码如下:mylineedi_qlineedit输入中文无法删除
文章浏览阅读1k次。jeb-1.5.201408040(full)_keygen_by_scz(20150725) http://scz.617.cn/ 修改jeb_wincon.bat 中java home 变量,然后就可以启动 注册机 java kegen_jeb下载 csdn
文章浏览阅读60次。IO编程文件读写打开文件open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True) 具体需要查看API,这里只介绍几个常用的方法。open函数的文件名是必传参数,返回一个文件对象#打开一个文件。f = open('read.txt', 'r')open函数的mode参数:值..._python程序里面传进去的参数是绿色