yabo888vip
Mou Mou Jidian Generator
发电机维修 发电机回收
发电机出售 发电机租赁
客户统一服务热线

054-65025407
17278895878

4静音发电机
您的位置: 主页 > 产品中心 > 静音发电机 >
一份来自蚂蚁金服大佬的数据库设计总结,纯干货,值得收藏“yabo888vip”

一份来自蚂蚁金服大佬的数据库设计总结,纯干货,值得收藏“yabo888vip”

本文摘要:一个乐成的治理系统,是由:[50% 的业务 + 50% 的软件] 所组成,而 50% 的乐成软件又有 [25% 的数据库 + 25% 的法式] 所组成,数据库设计的优劣是一个关键。如果把企业的数据比做生命所必须的血液,那么数据库的设计就是应用中最重要的一部门。有关数据库设计的质料汗牛充栋,大学学位课程里也有专门的讲述。 不外,就如我们重复强调的那样,再好的老师也比不外履历的教诲。

yabo888vip

一个乐成的治理系统,是由:[50% 的业务 + 50% 的软件] 所组成,而 50% 的乐成软件又有 [25% 的数据库 + 25% 的法式] 所组成,数据库设计的优劣是一个关键。如果把企业的数据比做生命所必须的血液,那么数据库的设计就是应用中最重要的一部门。有关数据库设计的质料汗牛充栋,大学学位课程里也有专门的讲述。

不外,就如我们重复强调的那样,再好的老师也比不外履历的教诲。所以我归纳历年来所走的弯路及体会,并在网上找了些对数据库设计颇有造诣的专业人士给大祖传授一些设计数据库的技巧和履历。

精选了其中的 60 个最佳技巧,并把这些技巧编写成了本文,为了利便索引其内容划分为 5 个部门:第 1 部门 - 设计数据库之前:这一部门枚举了 12 个基本技巧,包罗命名规范和明确业务需求等。第 2 部门 - 设计数据库表:总共 24 个指南性技巧,涵盖表内字段设计以及应该制止的常见问题等。

第 3 部门 - 选择键:怎么选择键呢?这里有 10 个技巧专门涉及系统生成的主键的正确用法,另有何 时以及如何索引字段以获得最佳性能等。第 4 部门 - 保证数据完整性:讨论如何保持数据库的清晰和结实,如何把有害数据降低到最小水平。第 5 部门 - 种种小技巧:不包罗在以上 4 个部门中的其他技巧,五花八门,有了它们希望你的数据库开发事情会更轻松一些。

一、设计数据库之前考察现有情况在设计一个新数据库时,你不光应该仔细研究业务需求而且还要考察现有的系统。大多数数据库项目都不是重新开始建设的;通常,机构内总会存在用来满足特定需求的现有系统(可能没有实现自动盘算)。显然,现有系统并不完美,否则你就不必再建设新系统了。

可是对旧系统的研究可以让你发现一些可能会忽略的细微问题。一般来说,考察现有系统对你绝对有利益。

界说尺度的工具命名规范一定要界说数据库工具的命名规范。对数据库表来说,从项目一开始就要确定表名是接纳复数还是单数形式。

此外还要给表的别名界说简朴规则(例如说,如果表名是一个单词,别名就取单词的前 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 表达式的文档化来说这是完全须要的。建立模式一张图表胜过千言万语:开发人员不仅要阅读和实现它,而且还要用它来资助自己和用户对话。模式有助于提高协作效能,这样在先期的数据库设计中险些不行能泛起大的问题。

模式不必弄的很庞大;甚至可以简朴得手写在一张纸上就可以了。只是要保证其上的逻辑关系以后能发生效益。

从输入输出下手在界说数据库表和字段需求(输入)时,首先应检查现有的或者已经设计出的报表、查询和视图(输出)以决议为了支持这些输出哪些是须要的表和字段。举个简朴的例子:如果客户需要一个报表根据邮政编码排序、分段和求和,你要保证其中包罗了单独的邮政编码字段而不要把邮政编码糅进地址字段里。

报表技巧要相识用户通常是如何陈诉数据的:批处置惩罚还是在线提交报表?时间距离是天天、每周、每月、每个季度还是每年?如果需要的话还可以思量建立总结表。系统生成的主键在报表中很难治理。用户在具有系统生成主键的表内用副键举行检索往往会返回许多重复数据。

这样的检索性能比力低而且容易引起杂乱。明白客户需求看起来这应该是显而易见的事,但需求就是来自客户(这里要从内部和外部客户的角度思量)。

不要依赖用户写下来的需求,真正的需求在客户的脑壳里。你要让客户解释其需求,而且随着开发的继续,还要经常询问客户保证其需求仍然在开发的目的之中。一个稳定的真理是:“只有我瞥见了我才知道我想要的是什么”一定会导致大量的返工,因为数据库没有到达客户从来没有写下来的需求尺度。

而更糟的是你对他们需求的解释只属于你自己,而且可能是完全错误的。二、设计表和字段检查种种变化我在设计数据库的时候会思量到哪些数据字段未来可能会发生变换。例如说,姓氏就是如此(注意是西方人的姓氏,好比女性完婚后从夫姓等)。所以,在建设系统存储客户信息时,我倾向于在单独的一个数据内外存储姓氏字段,而且还附加起始日和终止日等字段,这样就可以跟踪这一数据条目的变化。

接纳有意义的字段名有一回我到场开发过一个项目,其中有从其他法式员那里继续的法式,谁人法式员喜欢用屏幕上显示数据指示用语命名字段,这也不赖,但不幸的是,她还喜欢用一些奇怪的命名法,其命名接纳了匈牙利命名和控制序号的组合形式,好比 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 USERnRecordVersion,记载的版本标志;有助于准确说明记载中泛起 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 的空间。但这分外占据的空间却无需未来重构整个数据库就可以实现数据库规模的增长了。

身份证的号码从 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 Customer.surname = "MYNAME" ;  and Customer.name_id = Order.cust_name_id and Order.quantity = 1第 1 个 SQL 语句没少键入几多字符。但如果查询涉及到 5 个表以致更多的列[字段]你就知道这个技巧多有用了。

三、选择键和索引数据采掘要预先计划我所在的某一客户部门一度要处置惩罚 8 万多份联系方式,同时填写每个客户的须要数据(这绝对不是小活)。我从中还要确定出一组客户作为市场目的。

当我从最开始设计表和字段的时候,我试图不在主索引里增加太多的字段以便加速数据库的运行速度。然后我意识到特定的组查询和信息采掘既禁绝确速度也不快。效果只幸亏主索引中重建而且合并了数据字段。

我发现有一个指示计划相当关键——当我想建立系统类型查找时为什么要接纳号码作为主索引字段呢?我可以用传真号码举行检索,可是它险些就象系统类型一样对我来说并不重要。接纳后者作为主字段,数据库更新后重新索引和检索就快多了。

可操作数据堆栈(ODS)和数据堆栈(DW)这两种情况下的数据索引是有差异的。在 DW 情况下,你要思量销售部门是如何组织销售运动的。他们并不是数据库治理员,可是他们确定表内的键信息。这里设计人员或者数据库事情人员应该分析数据库结构从而确定出性能和正确输出之间的最佳条件。

使用系统生成的主键这类同技巧 1,但我以为有须要在这里重复提醒大家。如果你总是在设计数据库的时候接纳系统生成的键作为主键,那么你实际控制了数据库的索引完整性。

这样,数据库和非人工机制就有效地控制了对存储数据中每一行的会见。接纳系统生成键作为主键另有一个优点:当你拥有一致的键结构时,找到逻辑缺陷很容易。剖析字段用于索引为了分散命名字段和包罗字段以支持用户界说的报表,请思量剖析其他字段(甚至主键)为其组成要素以便用户可以对其举行索引。索引将加速 SQL 和报表生成器剧本的执行速度。

例如说,我通常在必须使用 SQL LIKE 表达式的情况下建立报表,因为 case number 字段无法剖析为 year、serial number、case type 和 defendant code 等要素。性能也会变坏。

如果年度和类型字段可以剖析为索引字段那么这些报表运行起来就会快多了。键设计 4 原则为关联字段建立外键。所有的键都必须唯一。

制止使用复合键。外键总是关联唯一的键字段。别忘了索引索引是从数据库中获取数据的最高效方式之一。

95% 的数据库性能问题都可以接纳索引技术获得解决。作为一条规则,我通常对逻辑主键使用唯一的成组索引,对系统键(作为存储历程)接纳唯一的非成组索引,对任何外键列[字段]接纳非成组索引。

不外,索引就象是盐,太多了菜就咸了。你得思量数据库的空间有多大,表如何举行会见,另有这些会见是否主要用作读写。

大多数数据库都索引自动建立的主键字段,可是可别忘了索引外键,它们也是经常使用的键,好比运行查询显示主表和所有关联表的某条记载就用得上。另有,不要索引 memo/note 字段,不要索引大型字段(有许多字符),这样作会让索引占用太多的存储空间。

不要索引常用的小型表不要为小型数据表设置任何键,如果它们经常有插入和删除操作就更别这样作了。对这些插入和删除操作的索引维护可能比扫描表空间消耗更多的时间。不要把社会保障号码(SSN)或身份证号码(ID)选作键永远都不要使用 SSN 或 ID 作为数据库的键。

除了隐私原因以外,须知政府越来越趋向于禁绝许把 SSN 或 ID 用作除收入相关以外的其他目的,SSN 或 ID 需要手工输入。永远不要使用手工输入的键作为主键,因为一旦你输入错误,你唯一能做的就是删除整个记载然后重新开始。我在破解他人的法式时候,我看到许多人把 SSN 或 ID 还曾被用做系列号,固然只管这么做是非法的。

而且人们也都知道这是非法的,但他们已经习惯了。厥后,随着偷取身份犯罪案件的增加,我现在的同行正痛苦地从一大摊子数据中把 SSN 或 ID 删除。不要用用户的键在确定接纳什么字段作为表的键的时候,可一定要小心用户将要编辑的字段。

通常的情况下不要选择用户可编辑的字段作为键。这样做会迫使你接纳以下两个措施:在建立记载之后对用户编辑字段的行为施加限制。如果你这么做了,你可能会发现你的应用法式在商务需求突然发生变化,而用户需要编辑那些不行编辑的字段时缺乏足够的灵活性。

当用户在输入数据之后直到生存记载才发现系统出了问题他们该怎么想?删除重建?如果记载不行重建是否让用户走开?提出一些检测和纠正键冲突的方法。通常,费点精神也就搞定了,可是从性能上来看这样做的价格就比力大了。另有,键的纠正可能会迫使你突破你的数据和商业/用户界面层之间的隔离。

所以还是重提一句老话:你的设计要适应用户而不是让用户来适应你的设计。不让主键具有可更新性的原因是在关系模式下,主键实现了差别表之间的关联。

好比,Customer 表有一个主键 CustomerID,而客户的定单则存放在另一个内外。Order 表的主键可能是 OrderNo 或者 OrderNo、CustomerID 和日期的组合。不管你选择哪种键设置,你都需要在 Order 表中存放 CustomerID 来保证你可以给下定单的用户找到其定单记载。如果你在 Customer 内外修改了 CustomerID,那么你必须找出 Order 表中的所有相关记载对其举行修改。

否则,有些定单就会不属于任何客户——数据库的完整性就算完蛋了。如果索引完整性规则施加到表一级,那么在不编写大量代码和附加删除记载的情况下险些不行能改变某一条记载的键和数据库内所有关联的记载。而这一历程往往错误丛生所以应该只管制止。

可选键(候选键)有时可做主键记着,查询数据的不是机械而是人。如果你有可选键,你可能进一步把它用做主键。

那样的话,你就拥有了建设强大索引的能力。这样可以阻止使用数据库的人不得不毗连数据库从而恰当的过滤数据。在严格控制域表的数据库上,这种负载是比力醒目的。

如果可选键真正有用,那就是到达了主键的水准。我的看法是,如果你有可选键,好比国家表内的 state_code,你不要在现有不能变更的唯一键上建立后续的键。你要做的无非是建立毫无价值的数据。

如你因为过分使用表的后续键[别名]建设这种表的关联,操作负载真得需要思量一下了。别忘了外键大多数数据库索引自动建立的主键字段。但别忘了索引外键字段,它们在你想查询主表中的记载及其关联记载时每次都市用到。

另有,不要索引 memo/notes 字段而且不要索引大型文本字段(许多字符),这样做会让你的索引占据大量的数据库空间。预告:在第四部门将讨论保证数据完整性,如何保持数据库的清晰和结实,如何把有害数据降低到最小水平。四、保证数据的完整性一个乐成的治理系统,是由:[50% 的业务 + 50% 的软件] 所组成,而 50% 的乐成软件又有 [25% 的数据库 + 25% 的法式] 所组成,数据库设计的优劣是一个关键。如果把企业的数据比做生命所必须的血液,那么数据库的设计就是应用中最重要的一部门。

有关数据库设计的质料汗牛充栋,大学学位课程里也有专门的讲述。不外,就如我们重复强调的那样,再好的老师也比不外履历的教诲。所以我归纳历年来所走的弯路及体会,并在网上找了些对数据库设计颇有造诣的专业人士给大祖传授一些设计数据库的技巧和履历。

精选了其中的 60 个最佳技巧,并把这些技巧编写成了本文,为了利便索引其内容划分为 5 个部门:第一部门先容了设计数据库之前12个基本技巧,包罗命名规范和明确业务需求等(数据库设计履历谈(1) );第二部门先容设计数据库表24个指南性技巧,涵盖表内字段设计以及应该制止的常见问题等(数据库设计履历谈 (2) );第三部门主要先容选择键和索引,包罗10个技巧专门涉及系统生成的主键的正确用法,另有何时以及如何索引字段以获得最佳性能等(数据库设计履历谈 (3) )。本次第四部门主要讨论保证数据完整性,如何保持数据库的清晰和结实,如何把有害数据降低到最小水平。用约束而非商务规则强制数据完整性如果你根据商务规则来处置惩罚需求,那么你应当检查商务条理/用户界面:如果商务规则以后发生变化,那么只需要举行更新即可。如果需求源于维护数据完整性的需要,那么在数据库层面上需要施加限制条件。

如果你在数据层确实接纳了约束,你要保证有措施把更新不能通过约束检查的原因接纳用户明白的语言通知用户界面。除非你的字段命名很冗长,否则字段名自己还不够。只要有可能,请接纳数据库系统实现数据的完整性。

这不光包罗通过尺度化实现的完整性而且还包罗数据的功效性。在写数据的时候还可以增加触发器来保证数据的正确性。

不要依赖于商务层保证数据完整性;它不能保证表之间(外键)的完整性所以不能强加于其他完整性规则之上。漫衍式数据系统对漫衍式系统而言,在你决议是否在各个站点复制所有数据还是把数据生存在一个地方之前应该预计一下未来 5 年或者 10 年的数据量。当你把数据传送到其他站点的时候,最幸亏数据库字段中设置一些标志。

在目的站点收到你的数据之后更新你的标志。为了举行这种数据传输,请写下你自己的批处置惩罚或者调理法式以特定时间距离运行而不要让用户在天天的事情后传输数据。当地拷贝你的维护数据,好比盘算常数和利息率等,设置版本号保证数据在每个站点都完全一致。

强制指示完整性(参照完整性)没有好措施能在有害数据进入数据库之后消除它,所以你应该在它进入数据库之前将其剔除。激活数据库系统的指示完整性特性。这样可以保持数据的清洁而能迫使开发人员投入更多的时间处置惩罚错误条件。

关系如果两个实体之间存在多对一关系,而且另有可能转化为多对多关系,那么你最好一开始就设置成多对多关系。从现有的多对一关系转变为多对多关系比一开始就是多对多关系要难过多。

接纳视图为了在你的数据库和你的应用法式代码之间提供另一层抽象,你可以为你的应用法式建设专门的视图而不必非要应用法式直接会见数据表。这样做还即是在处置惩罚数据库变换时给你提供了更多的自由。给数据保有和恢复制定计划思量数据保有计谋并包罗在设计历程中,预先设计你的数据恢复历程。

接纳可以公布给用户/开发人员的数据字典实现利便的数据识别同时保证对数据源文档化。编写在线更新来“更新查询”供以后万一数据丢失可以重新处置惩罚更新。用存储历程让系统做重活解决了许多贫苦来发生一个具有高度完整性的数据库解决方案之后,我决议封装一些关联表的功效组,提供一整套通例的存储历程来会见各组以便加速速度和简化客户法式代码的开发。

数据库不只是一个存放数据的地方,它也是简化编码之地。使用查找控制数据完整性的最佳方式就是限制用户的选择。只要有可能都应该提供应用户一个清晰的价值列表供其选择。

这样将淘汰键入代码的错误和误解同时提供数据的一致性。某些公共数据特别适合查找:国家代码、状态代码等。

预告:在第五部门将先容种种小技巧,不包罗在以上 4 个部门中的其他技巧,五花八门,有了它们希望你的数据库开发事情会更轻松一些。五、种种小技巧一个乐成的治理系统,是由:[50% 的业务 + 50% 的软件] 所组成,而 50% 的乐成软件又有 [25% 的数据库 + 25% 的法式] 所组成,数据库设计的优劣是一个关键。

如果把企业的数据比做生命所必须的血液,那么数据库的设计就是应用中最重要的一部门。有关数据库设计的质料汗牛充栋,大学学位课程里也有专门的讲述。不外,就如我们重复强调的那样,再好的老师也比不外履历的教诲。

所以我归纳历年来所走的弯路及体会,并在网上找了些对数据库设计颇有造诣的专业人士给大祖传授一些设计数据库的技巧和履历。精选了其中的 60 个最佳技巧,并把这些技巧编写成了本文,为了利便索引其内容划分为 5 个部门:第一部门先容了设计数据库之前12个基本技巧,包罗命名规范和明确业务需求等(数据库设计履历谈(1) );第二部门先容设计数据库表24个指南性技巧,涵盖表内字段设计以及应该制止的常见问题等(数据库设计履历谈 (2) );第三部门主要先容选择键和索引,包罗10个技巧专门涉及系统生成的主键的正确用法,另有何时以及如何索引字段以获得最佳性能等(数据库设计履历谈 (3) )。

第四部门主要讨论保证数据完整性,如何保持数据库的清晰和结实,如何把有害数据降低到最小水平(数据库设计履历谈 (4)),本次第五部门主要先容不包罗在以上 4 个部门中的其他技巧,五花八门,有了它们希望你的数据库开发事情会更轻松一些。文档、文档、文档对所有的快捷方式、命名规范、限制和函数都要体例文档。

接纳给表、列[字段]、触发器等加注释的数据库工具。是的,这有点费事,但从久远来看,这样做对开发、支持和跟踪修改很是有用。

取决于你使用的数据库系统,可能有一些软件会给你一些供你很快上手的文档。你可能希望先开始在说,然后获得越来越多的细节。或者你可能希望周期性的预排,在输入新数据同时随着你的希望对每一部门细节化。

不管你选择哪种方式,总要对你的数据库文档化,或者在数据库自身的内部或者单独建设文档。这样,当你过了一年多时间后再回过头来做第 2 个版本,你犯错的时机将大大淘汰。使用常用英语(或者其他任何语言)而不要使用编码为什么我们经常接纳编码(好比 9935A 可能是‘青岛啤酒’的供应代码,4XF788-Q 可能是帐目编码)?理由许多。可是用户通常都用英语举行思考而不是编码。

事情 5 年的会计或许知道 4XF788-Q 是什么工具,但新来的可就纷歧定了。在建立下拉菜单、列表、报表时最好根据英语名排序。如果你需要编码,那你可以在编码旁附上用户知道的英语。

生存常用信息让一个表专门存放一般数据库信息很是有用。我常在这个内外存放数据库当前版本、最近检查/修复(对 FoxPro)、关联设计文档的名称、客户等信息。

这样可以实现一种简朴机制跟踪数据库,当客户诉苦他们的数据库没有到达希望的要求而与你联系时,这样做对非客户机/服务器情况特别有用。测试、测试、重复测试建设或者修订数据库之后,必须用用户新输入的数据测试数据字段。最重要的是,让用户举行测试而且同用户一道保证你选择的数据类型满足商业要求。

测试需要在把新数据库投入实际服务之前完成。检查设计在开发期间检查数据库设计的常用技术是通过其所支持的应用法式原型检查数据库。

换句话说,针对每一种最终表达数据的原型应用,保证你检查了数据模型而且检察如何取出数据。Microsoft Visual FoxPro 设计技巧对庞大的 Microsoft Visual FoxPro 数据库应用法式而言,可以把所有的主表放在一个数据库容器文件里,然后增加其他数据库表文件和装载同原有数据库有关的特殊文件。凭据需要用这些文件毗连到主文件中的主表。好比数据输入、数据索引、统计分析、向治理层或者政府部门提供报表以及各种只读查询等。

这一措施简化了用户和组权限的分配,而且有利于应用法式函数(存储历程)的分组和划分,从而在法式必须修改的时候易于治理。


本文关键词:一份,来自,蚂蚁,金服大,佬,yabo888vip,的,数据库,设计

本文来源:yabo888vip-www.hfjiankun.com

Copyright © 2008-2021 www.hfjiankun.com. yabo888vip科技 版权所有  ICP备案:ICP备66086078号-4