共享锁
共享 (S) 锁允许并发事务读取 (SELECT) 一个资源。资源上存在共享 (S) 锁时,任何其它事务都不能修改数据。一旦已经读取数据,便立即释放资源上的共享 (S) 锁,除非将事务隔离级别设置为可重复读或更高级别,或者在事务生存周期内用锁定提示保留共享 (S) 锁。
更新锁
更新 (U) 锁可以防止通常形式的死锁。一般更新模式由一个事务组成,此事务读取记录,获取资源(页或行)的共享 (S) 锁,然后修改行,此 *** 作要求锁转换为排它 (X) 锁。如果两个事务获得了资源上的共享模式锁,然后试图同时更新数据,则一个事务尝试将锁转换为排它 (X) 锁。共享模式到排它锁的转换必须等待一段时间,因为一个事务的排它锁与其它事务的共享模式锁不兼容;发生锁等待。第二个事务试图获取排它 (X) 锁以进行更新。由于两个事务都要转换为排它 (X) 锁,并且每个事务都等待另一个事务释放共享模式锁,因此发生死锁。
若要避免这种潜在的死锁问题,请使用更新 (U) 锁。一次只有一个事务可以获得资源的更新 (U) 锁。如果事务修改资源,则更新 (U) 锁转换为排它 (X) 锁。否则,锁转换为共享锁。
排它锁
排它 (X) 锁可以防止并发事务对资源进行访问。其它事务不能读取或修改排它 (X) 锁锁定的数据。
意向锁
意向锁表示 SQL Server 需要在层次结构中的某些底层资源上获取共享 (S) 锁或排它 (X) 锁。例如,放置在表级的共享意向锁表示事务打算在表中的页或行上放置共享 (S) 锁。在表级设置意向锁可防止另一个事务随后在包含那一页的表上获取排它 (X) 锁。意向锁可以提高性能,因为 SQL Server 仅在表级检查意向锁来确定事务是否可以安全地获取该表上的锁。而无须检查表中的每行或每页上的锁以确定事务是否可以锁定整个表。
意向锁包括意向共享 (IS)、意向排它 (IX) 以及与意向排它共享 (SIX)。对于人脸识别,多数人是又爱又恨,爱的是它的方便快捷,恨的就是安全风险。嫌疑人“AI 换脸”骗过人脸识别实施犯罪在警方今年破获的两起盗用公民个人信息案中,值得注意的是,犯罪嫌疑人都是利用“AI 换脸技术”非法获取公民照片进行一定预处理,而后再通过“照片活化”软件生成动态视频,骗过了人脸核验机制,得以实施犯罪的。
专家表示,目前最简单的人脸识别,只需要采集、提取人脸上的 6 个或 8 个特征点就能实现。而复杂的人脸识别,则需要采集、提取人脸上的数十个乃至上百个特征点才能实现。相比于解锁手机,“刷脸”支付、“刷脸”进小区等应用,采集的人脸特征点更多,安全性自然也更高。
此外,目前已经研发出了专门针对生物特征的活体检测技术,可有效识别扫描对象的生命体征,大大降低了识别系统把照片或面具当人脸的风险。
经调查发现,在某些网络交易平台上,只要花 2 元钱就能买到上千张人脸照片,而 5000 多张人脸照片标价还不到 10 元。
这些包含个人信息的人脸照片如果落入不法分子手中,照片主人除了有可能遭遇精准诈骗,蒙受财产损失之外,甚至还有可能因自己的人脸信息被用于洗钱、涉黑等违法犯罪活动,而卷入刑事诉讼。在专家看来,当下人脸识别技术的风险点,更多集中在存储环节。由于人脸识别应用五花八门,也没有统一的行业标准,大量的人脸数据都被存储在各应用运营方,或是技术提供方的中心化数据库中。
数据是否脱敏、安全是否到位、哪些用于算法训练、哪些会被合作方分享,外界一概不知。而且,一旦服务器被入侵,高度敏感的人脸数据就会面临泄露风险。数据库设计经验谈
一个成功的管理系统,是由:[50% 的业务 + 50% 的软件] 所组成,而 50% 的成功软件又有 [25% 的数据库 + 25% 的程序] 所组成,数据库设计的好坏是一个关键。如果把企业的数据比做生命所必需的血液,那么数据库的设计就是应用中最重要的一部分。有关数据库设计的材料汗牛充栋,大学学位课程里也有专门的讲述。不过,就如我们反复强调的那样,再好的老师也比不过经验的教诲。所以我归纳历年来所走的弯路及体会,并在网上找了些对数据库设计颇有造诣的专业人士给大家传授一些设计数据库的技巧和经验。精选了其中的 60 个最佳技巧,并把这些技巧编写成了本文,为了方便索引其内容划分为 5 个部分:
第 1 部分 - 设计数据库之前
这一部分罗列了 12 个基本技巧,包括命名规范和明确业务需求等。
第 2 部分 - 设计数据库表
总共 24 个指南性技巧,涵盖表内字段设计以及应该避免的常见问题等。
第 3 部分 - 选择键
怎么选择键呢?这里有 10 个技巧专门涉及系统生成的主键的正确用法,还有何 时以及如何索引字段以获得最佳性能等。
第 4 部分 - 保证数据完整性
讨论如何保持数据库的清晰和健壮,如何把有害数据降低到最小程度。
第 5 部分 - 各种小技巧
不包括在以上 4 个部分中的其他技巧,五花八门,有了它们希望你的数据库开发工作会更轻松一些。
第 1 部分 - 设计数据库之前
考察现有环境
在设计一个新数据库时,你不但应该仔细研究业务需求而且还要考察现有的系统。大多数数据库项目都不是从头开始建立的;通常,机构内总会存在用来满足特定需求的现有系统(可能没有实现自动计算)。显然,现有系统并不完美,否则你就不必再建立新系统了。但是对旧系统的研究可以让你发现一些可能会忽略的细微问题。一般来说,考察现有系统对你绝对有好处。
定义标准的对象命名规范
一定要定义数据库对象的命名规范。对数据库表来说,从项目一开始就要确定表名是采用复数还是单数形式。此外还要给表的别名定义简单规则(比方说,如果表名是一个单词,别名就取单词的前 4 个字母;如果表名是两个单词,就各取两个单词的前两个字母组成 4 个字母长的别名;如果表的名字由 3 个单词组成,你不妨从头两个单词中各取一个然后从最后一个单词中再取出两个字母,结果还是组成 4 字母长的别名,其余依次类推)对工作用表来说,表名可以加上前缀 WORK_ 后面附上采用该表的应用程序的名字。表内的列[字段]要针对键采用一整套设计规则。比如,如果键是数字类型,你可以用 _N 作为后缀;如果是字符类型则可以采用 _C 后缀。对列[字段]名应该采用标准的前缀和后缀。再如,假如你的表里有好多“money”字段,你不妨给每个列[字段]增加一个 _M 后缀。还有,日期列[字段]最好以 D_ 作为名字打头。
检查表名、报表名和查询名之间的命名规范。你可能会很快就被这些不同的数据库要素的名称搞糊涂了。假如你坚持统一地命名这些数据库的不同组成部分,至少你应该在这些对象名字的开头用 Table、Query 或者 Report 等前缀加以区别。
如果采用了 Microsoft Access,你可以用 qry、rpt、tbl 和 mod 等符号来标识对象(比如 tbl_Employees)。我在和 SQL Server 打交道的时候还用过 tbl 来索引表,但我用 sp_company (现在用 sp_feft_)标识存储过程,因为在有的时候如果我发现了更好的处理办法往往会保存好几个拷贝。我在实现 SQL Server 2000 时用 udf_ (或者类似的标记)标识我编写的函数。
工欲善其事, 必先利其器
采用理想的数据库设计工具,比如:SyBase 公司的 PowerDesign,她支持 PB、VB、Delphe 等语言,通过 ODBC 可以连接市面上流行的 30 多个数据库,包括 dBase、FoxPro、VFP、SQL Server 等,今后有机会我将着重介绍 PowerDesign 的使用。
获取数据模式资源手册
正在寻求示例模式的人可以阅读《数据模式资源手册》一书,该书由 Len Silverston、W H Inmon 和 Kent Graziano 编写,是一本值得拥有的最佳数据建模图书。该书包括的章节涵盖多种数据领域,比如人员、机构和工作效能等。其他的你还可以参考相关书籍。
畅想未来,但不可忘了过去的教训
我发现询问用户如何看待未来需求变化非常有用。这样做可以达到两个目的:首先,你可以清楚地了解应用设计在哪个地方应该更具灵活性以及如何避免性能瓶颈;其次,你知道发生事先没有确定的需求变更时用户将和你一样感到吃惊。
一定要记住过去的经验教训!我们开发人员还应该通过分享自己的体会和经验互相帮助。即使用户认为他们再也不需要什么支持了,我们也应该对他们进行这方面的教育,我们都曾经面临过这样的时刻“当初要是这么做了该多好”。
在物理实践之前进行逻辑设计
在深入物理设计之前要先进行逻辑设计。随着大量的 CASE 工具不断涌现出来,你的设计也可以达到相当高的逻辑水准,你通常可以从整体上更好地了解数据库设计所需要的方方面面。
了解你的业务
在你百分百地确定系统从客户角度满足其需求之前不要在你的 ER(实体关系)模式中加入哪怕一个数据表(怎么,你还没有模式?那请你参看技巧 9)。了解你的企业业务可以在以后的开发阶段节约大量的时间。一旦你明确了业务需求,你就可以自己做出许多决策了。
一旦你认为你已经明确了业务内容,你最好同客户进行一次系统的交流。采用客户的术语并且向他们解释你所想到的和你所听到的。同时还应该用可能、将会和必须等词汇表达出系统的关系基数。这样你就可以让你的客户纠正你自己的理解然后做好下一步的 ER 设计。
创建数据字典和 ER 图表
一定要花点时间创建 ER 图表和数据字典。其中至少应该包含每个字段的数据类型和在每个表内的主外键。创建 ER 图表和数据字典确实有点费时但对其他开发人员要了解整个设计却是完全必要的。越早创建越能有助于避免今后面临的可能混乱,从而可以让任何了解数据库的人都明确如何从数据库中获得数据。
有一份诸如 ER 图表等最新文档其重要性如何强调都不过分,这对表明表之间关系很有用,而数据字典则说明了每个字段的用途以及任何可能存在的别名。对 SQL 表达式的文档化来说这是完全必要的。
创建模式
一张图表胜过千言万语:开发人员不仅要阅读和实现它,而且还要用它来帮助自己和用户对话。模式有助于提高协作效能,这样在先期的数据库设计中几乎不可能出现大的问题。模式不必弄的很复杂;甚至可以简单到手写在一张纸上就可以了。只是要保证其上的逻辑关系今后能产生效益。
从输入输出下手
在定义数据库表和字段需求(输入)时,首先应检查现有的或者已经设计出的报表、查询和视图(输出)以决定为了支持这些输出哪些是必要的表和字段。举个简单的例子:假如客户需要一个报表按照邮政编码排序、分段和求和,你要保证其中包括了单独的邮政编码字段而不要把邮政编码糅进地址字段里。
报表技巧
要了解用户通常是如何报告数据的:批处理还是在线提交报表?时间间隔是每天、每周、每月、每个季度还是每年?如果需要的话还可以考虑创建总结表。系统生成的主键在报表中很难管理。用户在具有系统生成主键的表内用副键进行检索往往会返回许多重复数据。这样的检索性能比较低而且容易引起混乱。
理解客户需求
看起来这应该是显而易见的事,但需求就是来自客户(这里要从内部和外部客户的角度考虑)。不要依赖用户写下来的需求,真正的需求在客户的脑袋里。你要让客户解释其需求,而且随着开发的继续,还要经常询问客户保证其需求仍然在开发的目的之中。一个不变的真理是:“只有我看见了我才知道我想要的是什么”必然会导致大量的返工,因为数据库没有达到客户从来没有写下来的需求标准。而更糟的是你对他们需求的解释只属于你自己,而且可能是完全错误的。
其余4部分待续
数据库设计经验谈 (2)
[前言]:一个成功的管理系统,是由:[50% 的业务 + 50% 的软件] 所组成,而 50% 的成功软件又有 [25% 的数据库 + 25% 的程序] 所组成,数据库设计的好坏是一个关键。如果把企业的数据比做生命所必需的血液,那么数据库的设计就是应用中最重要的一部分。有关数据库设计的材料汗牛充栋,大学学位课程里也有专门的讲述。不过,就如我们反复强调的那样,再好的老师也比不过经验的教诲。所以我归纳历年来所走的弯路及体会,并在网上找了些对数据库设计颇有造诣的专业人士给大家传授一些设计数据库的技巧和经验。精选了其中的 60 个最佳技巧,并把这些技巧编写成了本文,为了方便索引其内容划分为 5 个部分:
上一部分介绍了设计数据库之前12个基本技巧,包括命名规范和明确业务需求等( 数据库设计经验谈[1])。本次第二部分介绍设计数据库表24个指南性技巧,涵盖表内字段设计以及应该避免的常见问题等。
第 2 部分 - 设计表和字段
检查各种变化
我在设计数据库的时候会考虑到哪些数据字段将来可能会发生变更。比方说,姓氏就是如此(注意是西方人的姓氏,比如女性结婚后从夫姓等)。所以,在建立系统存储客户信息时,我倾向于在单独的一个数据表里存储姓氏字段,而且还附加起始日和终止日等字段,这样就可以跟踪这一数据条目的变化。
采用有意义的字段名
有一回我参加开发过一个项目,其中有从其他程序员那里继承的程序,那个程序员喜欢用屏幕上显示数据指示用语命名字段,这也不赖,但不幸的是,她还喜欢用一些奇怪的命名法,其命名采用了匈牙利命名和控制序号的组合形式,比如 cbo1、txt2、txt2_b 等等。
除非你在使用只面向你的缩写字段名的系统,否则请尽可能地把字段描述的清楚些。当然,也别做过头了,比如 Customer_Shipping_Address_Street_Line_1,虽然很富有说明性,但没人愿意键入这么长的名字,具体尺度就在你的把握中。
采用前缀命名
如果多个表里有好多同一类型的字段(比如 FirstName),你不妨用特定表的前缀(比如 CusLastName)来帮助你标识字段。
时效性数据应包括“最近更新日期/时间”字段。时间标记对查找数据问题的原因、按日期重新处理/重载数据和清除旧数据特别有用。
标准化和数据驱动
数据的标准化不仅方便了自己而且也方便了其他人。比方说,假如你的用户界面要访问外部数据源(文件、XML 文档、其他数据库等),你不妨把相应的连接和路径信息存储在用户界面支持表里。还有,如果用户界面执行工作流之类的任务(发送邮件、打印信笺、修改记录状态等),那么产生工作流的数据也可以存放在数据库里。预先安排总需要付出努力,但如果这些过程采用数据驱动而非硬编码的方式,那么策略变更和维护都会方便得多。事实上,如果过程是数据驱动的,你就可以把相当大的责任推给用户,由用户来维护自己的工作流过程。
标准化不能过头
对那些不熟悉标准化一词(normalization)的人而言,标准化可以保证表内的字段都是最基础的要素,而这一措施有助于消除数据库中的数据冗余。标准化有好几种形式,但 Third Normal Form(3NF)通常被认为在性能、扩展性和数据完整性方面达到了最好平衡。简单来说,3NF 规定:
表内的每一个值都只能被表达一次。
表内的每一行都应该被唯一的标识(有唯一键)。
表内不应该存储依赖于其他键的非键信息。
遵守 3NF 标准的数据库具有以下特点:有一组表专门存放通过键连接起来的关联数据。比方说,某个存放客户及其有关定单的 3NF 数据库就可能有两个表:Customer 和 Order。Order 表不包含定单关联客户的任何信息,但表内会存放一个键值,该键指向 Customer 表里包含该客户信息的那一行。
更高层次的标准化也有,但更标准是否就一定更好呢?答案是不一定。事实上,对某些项目来说,甚至就连 3NF 都可能给数据库引入太高的复杂性。
为了效率的缘故,对表不进行标准化有时也是必要的,这样的例子很多。曾经有个开发餐饮分析软件的活就是用非标准化表把查询时间从平均 40 秒降低到了两秒左右。虽然我不得不这么做,但我绝不把数据表的非标准化当作当然的设计理念。而具体的 *** 作不过是一种派生。所以如果表出了问题重新产生非标准化的表是完全可能的。
Microsoft Visual FoxPro 报表技巧
如果你正在使用 Microsoft Visual FoxPro,你可以用对用户友好的字段名来代替编号的名称:比如用 Customer Name 代替 txtCNaM。这样,当你用向导程序 [Wizards,台湾人称为‘精灵’] 创建表单和报表时,其名字会让那些不是程序员的人更容易阅读。
不活跃或者不采用的指示符
增加一个字段表示所在记录是否在业务中不再活跃挺有用的。不管是客户、员工还是其他什么人,这样做都能有助于再运行查询的时候过滤活跃或者不活跃状态。同时还消除了新用户在采用数据时所面临的一些问题,比如,某些记录可能不再为他们所用,再删除的时候可以起到一定的防范作用。
使用角色实体定义属于某类别的列[字段]
在需要对属于特定类别或者具有特定角色的事物做定义时,可以用角色实体来创建特定的时间关联关系,从而可以实现自我文档化。
这里的含义不是让 PERSON 实体带有 Title 字段,而是说,为什么不用 PERSON 实体和 PERSON_TYPE 实体来描述人员呢?比方说,当 John Smith, Engineer 提升为 John Smith, Director 乃至最后爬到 John Smith, CIO 的高位,而所有你要做的不过是改变两个表 PERSON 和 PERSON_TYPE 之间关系的键值,同时增加一个日期/时间字段来知道变化是何时发生的。这样,你的 PERSON_TYPE 表就包含了所有 PERSON 的可能类型,比如 Associate、Engineer、Director、CIO 或者 CEO 等。
还有个替代办法就是改变 PERSON 记录来反映新头衔的变化,不过这样一来在时间上无法跟踪个人所处位置的具体时间。
采用常用实体命名机构数据
组织数据的最简单办法就是采用常用名字,比如:PERSON、ORGANIZATION、ADDRESS 和 PHONE 等等。当你把这些常用的一般名字组合起来或者创建特定的相应副实体时,你就得到了自己用的特殊版本。开始的时候采用一般术语的主要原因在于所有的具体用户都能对抽象事物具体化。
有了这些抽象表示,你就可以在第 2 级标识中采用自己的特殊名称,比如,PERSON 可能是 Employee、Spouse、Patient、Client、Customer、Vendor 或者 Teacher 等。同样的,ORGANIZATION 也可能是 MyCompany、MyDepartment、Competitor、Hospital、Warehouse、Government 等。最后 ADDRESS 可以具体为 Site、Location、Home、Work、Client、Vendor、Corporate 和 FieldOffice 等。
采用一般抽象术语来标识“事物”的类别可以让你在关联数据以满足业务要求方面获得巨大的灵活性,同时这样做还可以显著降低数据存储所需的冗余量。
用户来自世界各地
在设计用到网络或者具有其他国际特性的数据库时,一定要记住大多数国家都有不同的字段格式,比如邮政编码等,有些国家,比如新西兰就没有邮政编码一说。
数据重复需要采用分立的数据表
如果你发现自己在重复输入数据,请创建新表和新的关系。
每个表中都应该添加的 3 个有用的字段
dRecordCreationDate,在 VB 下默认是 Now(),而在 SQL Server 下默认为 GETDATE()
sRecordCreator,在 SQL Server 下默认为 NOT NULL DEFAULT USER
nRecordVersion,记录的版本标记;有助于准确说明记录中出现 null 数据或者丢失数据的原因
对地址和电话采用多个字段
描述街道地址就短短一行记录是不够的。Address_Line1、Address_Line2 和 Address_Line3 可以提供更大的灵活性。还有,电话号码和邮件地址最好拥有自己的数据表,其间具有自身的类型和标记类别。
过分标准化可要小心,这样做可能会导致性能上出现问题。虽然地址和电话表分离通常可以达到最佳状态,但是如果需要经常访问这类信息,或许在其父表中存放“首选”信息(比如 Customer 等)更为妥当些。非标准化和加速访问之间的妥协是有一定意义的。
使用多个名称字段
我觉得很吃惊,许多人在数据库里就给 name 留一个字段。我觉得只有刚入门的开发人员才会这么做,但实际上网上这种做法非常普遍。我建议应该把姓氏和名字当作两个字段来处理,然后在查询的时候再把他们组合起来。
我最常用的是在同一表中创建一个计算列[字段],通过它可以自动地连接标准化后的字段,这样数据变动的时候它也跟着变。不过,这样做在采用建模软件时得很机灵才行。总之,采用连接字段的方式可以有效的隔离用户应用和开发人员界面。
提防大小写混用的对象名和特殊字符
过去最令我恼火的事情之一就是数据库里有大小写混用的对象名,比如 CustomerData。这一问题从 Access 到 Oracle 数据库都存在。我不喜欢采用这种大小写混用的对象命名方法,结果还不得不手工修改名字。想想看,这种数据库/应用程序能混到采用更强大数据库的那一天吗?采用全部大写而且包含下划符的名字具有更好的可读性(CUSTOMER_DATA),绝对不要在对象名的字符之间留空格。
小心保留词
要保证你的字段名没有和保留词、数据库系统或者常用访问方法冲突,比如,最近我编写的一个 ODBC 连接程序里有个表,其中就用了 DESC 作为说明字段名。后果可想而知!DESC 是 DESCENDING 缩写后的保留词。表里的一个 SELECT 语句倒是能用,但我得到的却是一大堆毫无用处的信息。
保持字段名和类型的一致性
在命名字段并为其指定数据类型的时候一定要保证一致性。假如字段在某个表中叫做“agreement_number”,你就别在另一个表里把名字改成“ref1”。假如数据类型在一个表里是整数,那在另一个表里可就别变成字符型了。记住,你干完自己的活了,其他人还要用你的数据库呢。
仔细选择数字类型
在 SQL 中使用 smallint 和 tinyint 类型要特别小心,比如,假如你想看看月销售总额,你的总额字段类型是 smallint,那么,如果总额超过了 $32,767 你就不能进行计算 *** 作了。
删除标记
在表中包含一个“删除标记”字段,这样就可以把行标记为删除。在关系数据库里不要单独删除某一行;最好采用清除数据程序而且要仔细维护索引整体性。
避免使用触发器
触发器的功能通常可以用其他方式实现。在调试程序时触发器可能成为干扰。假如你确实需要采用触发器,你最好集中对它文档化。
包含版本机制
建议你在数据库中引入版本控制机制来确定使用中的数据库的版本。无论如何你都要实现这一要求。时间一长,用户的需求总是会改变的。最终可能会要求修改数据库结构。虽然你可以通过检查新字段或者索引来确定数据库结构的版本,但我发现把版本信息直接存放到数据库中不更为方便吗?
给文本字段留足余量
ID 类型的文本字段,比如客户 ID 或定单号等等都应该设置得比一般想象更大,因为时间不长你多半就会因为要添加额外的字符而难堪不已。比方说,假设你的客户 ID 为 10 位数长。那你应该把数据库表字段的长度设为 12 或者 13 个字符长。这算浪费空间吗?是有一点,但也没你想象的那么多:一个字段加长 3 个字符在有 1 百万条记录,再加上一点索引的情况下才不过让整个数据库多占据 3MB 的空间。但这额外占据的空间却无需将来重构整个数据库就可以实现数据库规模的增长了。身份z的号码从 15 位变成 18 位就是最好和最惨痛的例子。
列[字段]命名技巧
我们发现,假如你给每个表的列[字段]名都采用统一的前缀,那么在编写 SQL 表达式的时候会得到大大的简化。这样做也确实有缺点,比如破坏了自动表连接工具的作用,后者把公共列[字段]名同某些数据库联系起来,不过就连这些工具有时不也连接错误嘛。举个简单的例子,假设有两个表:
Customer 和 Order。Customer 表的前缀是 cu_,所以该表内的子段名如下:cu_name_id、cu_surname、cu_initials 和cu_address 等。Order 表的前缀是 or_,所以子段名是:or_order_id、or_cust_name_id、or_quantity 和 or_description 等。
这样从数据库中选出全部数据的 SQL 语句可以写成如下所示:
Select From Customer, Order Where cu_surname = "MYNAME" ;
and cu_name_id = or_cust_name_id and or_quantity = 1
在没有这些前缀的情况下则写成这个样子(用别名来区分):
Select From Customer, Order Where Customersurname = "MYNAME" ;
and Customername_id = Ordercust_name_id and Orderquantity = 1
第 1 个 SQL 语句没少键入多少字符。但如果查询涉及到 5 个表乃至更多的列[字段]你就知道这个技巧多有用了。
预告:第 3 部分 - 选择键
怎么选择键呢?这里有 10 个技巧专门涉及系统生成的主键的正确用法,还有何 时以及如何索引字段以获得最佳性能等。
数据库设计经验谈 (3) 出处:数据库论坛
[ 2005-07-26 09:56:21 ] 作者:夜来香 责任编辑:moningfeng
•影音享乐方式!Divx6完全评测
•浏览下载一条龙,Opera BT 体验
•软件观察:别让流氓软件耍无赖!
•关注!Longhorn 5203多图泄漏
•你会是那个超酷的"播客"吗
•我与超级兔子的恋爱史
•Divx Converter精彩试用
•图像格式转换的好帮手
•微软副总裁给中国大学生的信
•Java学习从入门到精通(附FAQ)
•PS立体光影魔术:在玻璃上打个洞
•Photoshop立体魔术2:光影的奥秘
•影音享乐方式!Divx6完全评测
•浏览下载一条龙,Opera BT 体验
•软件观察:别让流氓软件耍无赖!
•关注!Longhorn 5203多图泄漏
•你会是那个超酷的"播客"吗
•我与超级兔子的恋爱史
•Divx Converter精彩试用
•图像格式转换的好帮手
•微软副总裁给中国大学生的信
•Java学习从入门到精通(附FAQ)
•PS立体光影魔术:在玻璃上打个洞
•Photoshop立体魔术2:光影的奥秘
[前言]:一个成功的管理系统,是由:[50% 的业务 + 50% 的软件] 所组成,而 50% 的成功软件又有 [25% 的数据库 + 25% 的程序] 所组成,数据库设计的好坏是一个关键。如果把企业的数据比做生命所必需的血液,那么数据库的设计就是应用中最重要的一部分。有关数据库设计的材料汗牛充栋,大学学位课程里也有专门的讲述。不过,就如我们反复强调的那样,再好的老师也比不过经验的教诲。所以我归纳历年来所走的弯路及体会,并在网上找了些对数据库设计颇有造诣的专业人士给大家传授一些设计数据库的技巧和经验。精选了其中的 60 个最佳技巧,并把这些技巧编写成了本文,为了方便索引其内容划分为 5 个部分:
第一部分介绍了设计数据库之前12个基本技巧,包括命名规范和明确业务需求等(数据库设计经验谈 (1) );第二部分介绍设计数据库表24个指南性技巧,涵盖表内字段设计以及应该避免的常见问题等(数据库设计经验谈 (2) );本次第三部分主要介绍选择键和索引,包含10个技巧专门涉及系统生成的主键的正确用法,还有何时以及如何索引字段以获得最佳性能等。
第 3 部分 - 选择键和索引
数据采掘要预先计划
我所在的某一客户部门一度要处理 8 万多份,同时填写每个客户的必要数据(这绝对不是小活)。我从中还要确定出一组客户作为市场目标。当我从最开始设计表和字段的时候,我试图不在主索引里增加太多的字段以便加快数据库的运行速度。然后我意识到特定的组查询和信息采掘既不准确速度也不快。结果只好在主索引中重建而且合并了数据字段。我发现有一个指示计划相当关键——当我想创建系统类型查找时为什么要采用号码作为主索引字段呢?我可以用传真号码进行检索,但是它几乎就象系统类型一样对我来说并不重要。采用后者作为主字段,数据库更新后重新索引和检索就快多了。
可 *** 作数据仓库(ODS)和数据仓库(DW)这两种环境下的数据索引是有差别的。在 DW 环境下,你要考虑销售部门是如何组织销售活动的。他们并不是数据库管理员,但是他们确定表内的键信息。这里设计人员或者数据库工作人员应该分析数据库结构从而确定出性能和正确输出之间的最佳条件。
使用系统生成的主键
这类同技巧 1,但我觉得有必要在这里重复提醒大家。假如你总是在设计数据库的时候采用系统生成的键作为主键,那么你实际控制了数据库的索引完整性。这样,数据库和非人工机制就有效地控制了对存储数据中每一行的访问。
采用系统生成键作为主键还有一个优点:当你拥有一致的键结构时,找到逻辑缺陷很容易。
分解字段用于索引
为了分离命名字段和包含字段以支持用户定义的报表,请考虑分解其他字段(甚至主键)为其组成要素以便用户可以对其进行索引。索引将加快 SQL 和报表生成器脚本的执行速度。比方说,我通常在必须使用 SQL LIKE 表达式的情况下创建报表,因为 case number 字段无法分解为 year、serial number、case type 和 defendant code 等要素。性能也会变坏。假如下面是中达咨询给大家带来关于大型施工企业信息化建设的相关内容,以供参考。
1基础环境建设
11大型施工企业网络架构方案两种常见网络架构方式:(1)完全集中方案,是把数据集中存放总部,各项目部或分公司访问总应用服务器,总部→总部服务器→项目部①→项目部②→项目部③;(2)分布式集中方案,是把数据分布存放各项目部及总部,应用服务器在总部,总部→总部服务器→服务器→项目部①→服务器→项目部②→服务器→项目部③。12服务器部署服务器是指能通过网络对外提供服务的高性能计算机,是实现信息共享的载体,是信息化系统的核心设备。常用的服务器部署方案有集群部署、双服务器部署、单服务器部署。大型集团用户和关键业务用户一般采用集群部署方案,中型规模用户一般采用双服务器部署方案,小规模用户一般采用单服务器部署方案。13网络安全网络安全划分为网络内部安全、网络边界安全及网络连接及数据传输安全。网络内部安全一般采用安装防病毒软件系统、定期查杀病毒解决;网络边界安全采用安装防火墙、垃圾邮件过滤软件解决;网络连接及数据传输安全采用***网络或者光纤专线方式增强网络连接及数据传输安全安全性。14信息化管理制度———信息化软环境建设信息化软环境建设主要包括三方面内容:做好企业信息化战略规划;建立健全企业信息化组织机构;完善企业信息化管理规章制度、各类信息系统运行管理制度。2项目实施项目管理作为一门管理科学,同时也是一门艺术,更是一项系统工程。项目管理的核心是人,它涉及到与用户层、领导层和管理层之间大量的信息沟通,以及项目实施团队内部的资源协调与沟通工作。科学的项目管理方法对于项目工程能否按计划交付运行,将起到至关重要的作用。21实施原则项目实施应遵循总体规划、突出重点、分步实施、尽快见效的总体实施原则。211总体规划原则制定项目的总体规划应紧紧围绕合同管理与进度管理系统的建设的总战略和总目标来进行。在总体规划过程中将始终遵循和体现系统的集成性、开放性、先进性、成熟性、自适应性和指导性原则。在总体规划中我们将始终贯彻应用集成化、管理透视化、业务协同化、流程柔性化的总体技术路线,以满足工程项目管理当前和将来的发展变化的需要。212突出重点原则项目工程的实施过程中将紧紧围绕信息化建设,以信息化的项目管理为目标进行规划和实施。通过该项目的建设,将构建起一个集成的招投标管理、合同管理、进度管理、采购管理、库存管理等模块,为最终实现信息化工程项目管理打下坚实的基础。213分步实施原则分步实施原则就是坚持采用科学的项目管理、实施方法学,分阶段、分步骤地完善和优化的实施过程,将使实施风险降低到最低的限度。分步实施的另一个要点就是坚持推行成熟、稳定、可靠的系统策略,坚持先试点树立样板,再全面推广和完善。我们认为信息化本身应该是在一个总体目标下不断完善的过程。214尽快见效原则尽快见效就是坚持效益第一的原则,避免片面追求高技术,一切以实际利益为原则,又不失系统的先进性。22实施阶段根据项目系统建设的规划和要求,一般项目划分为项目启动、蓝图设计、蓝图实现、系统运行、系统验收、售后服务六个阶段。在项目运行时每个阶段、每个固定的时点、每项任务,都需按时编制相应的项目进度报告,并交付每个阶段的输出成果,以确保项目经理能准确把握项目进度,合理调配项目实施资源,使项目如期完工。221项目启动阶段又称项目准备阶段,该阶段主要任务有:定义项目组织、进行总体规划、定义项目执行与控制程序、召开项目动员会议、进行基本原理培训。该阶段工作流程:项目启动→定义项目组织→项目组织项目组通讯录→准备总体规划→总体调研计划→总体规划→里程碑计划、阶段实施进度计划(可选)、月实施进度计划、培训计划、总体规划、资源矩阵(可选)、资源数据表(可选)、质量管理计划(可选)→定义项目执行与控制程序→项目执行与控制程序→准备项目动员会议→项目启动会议议程→召开项目启动会议→项目启动会议会议记录→财务信息化原理培训→结束。222蓝图设计阶段项目蓝图设计阶段的主要工作为:进行项目调研准备、进行现有业务流程调研与分析、获得未来业务流程分析、定义。本阶段主要工作为对用户进行前期业务培训,进行详细的需求调研和业务流程模拟测试,最终确定所有业务流程、初始化方法等,并形成书面文件和指导手册交各业务单元进行实际业务 *** 作。具体工作流程:开始→准备总体规划→详细调研计划→提交详细调研问卷及用例培训(可选)→详细调研问卷及用例→现有流程调研→问题清单、现状调研报告(可选)→未来业务流程设计→业务需求解决方案→准备里程碑会议→里程碑计划、阶段实施进度计划、月实施进度计划、项目进度报告、项目交付成果质量检查表(内部使用)→举行里程碑会议→会议记录→结束。223蓝图实现阶段该阶段是整个项目实施中的关键阶段,项目蓝图实现阶段主要任务是:进行软件安装调试、应用预培训、进行基础数据准备、展开产品应用的详细分岗位培训、指导基础数据录入与预培训。蓝图实现阶段按工作内容和时段又可分为系统初始化阶段和系统日常业务实现阶段。通过前一阶段的项目蓝图设计制定了一系列的基础数据编码方案、业务流程、初始化指导手册等资料,用户可依据来进行基础数据资料的整理的录入;并在完成初始化工作的基础上进行系统的日常业务处理及工作流程培训实施。另外,为配合实施工作的顺利进行,在蓝图实现阶段要进行细致的培训工作,具体培训内容将在项目实施前和用户实施小组一起研究编制的培训计划中预以说明,并且在具体的业务 *** 作中,项目实施经理和实施工程师将会在用户实际工作现场予以相映的培训和指导。蓝图实现阶段具体工作流程:开始→准备安装调试→安装调试通知单→安装调试→安装调试验收单→预培训→培训签到表、培训记录→基础数据准备→基础数据收集与转换策略→制定基础数据收集与转换策略→基础数据编码指导→基础数据编码指导手册→指导用户制定初始化计划→基础数据收集与转换计划、基础数据收集与转换计划进度检查表→提供基础数据收集表(可选)→基础数据收集表→系统初始化进度检查→基础数据收集与转换计划进度检查表→确定基础数据→产品 *** 作培训→培训签到表、培训记录、培训反馈表→制定数据录入策略→指导用户确定数据录入计划→动态数据录入计划、动态数据录入进度检查表→是否需要调整系统设置-如NO→进行试运行评估(可选)→试运行评估报告→准备里程碑会议→基础数据收集与转换计划、基础数据收集与转换计划进度检查表→提供基础数据收集表(可选)→基础数据收集表→系统初始化进度检查→里程碑计划、阶段实施进度计划、月实施进度计划、项目进度报告、项目交付成果质量检查表→举行里程碑会议→会议纪要→结束。224系统运行阶段系统运行阶段的主要任务是:进一步完善系统,提高客户方终端用户对系统的熟练程度,确保系统成功交付。225系统交付阶段检查系统功能是否合乎验收标准、所交付的文档是否齐全。系统运行交付阶段工作流程:开始→指导用户定义员工权限→指导用户编制工作准则与规程→工作准则与规程(可选)→是否需要调整系统设置-如NO→准备系统交付→文档是否完整-如齐全→系统验收→文档验收→已签字的《交付文档验收标准》→功能验收→项目验收报告→结束。
更多关于工程/服务/采购类的标书代写制作,提升中标率,您可以点击底部官网客服免费咨询:>
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)