分享更有价值
被信任是一种快乐

数据库设计的方法有哪些

文章页正文上

这篇文章主要讲解了“数据库设计的方法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“数据库设计的方法有哪些”吧!数据库设计技巧:
第2部分—设计表和字段
1.检查各种变化
我在设计数据库的时候会考虑到哪些数据字段将来可能会发生变更。比方说,姓氏就是如此(注
意是西方人的姓氏,比如女性结婚后从夫姓等)。所以,在建立系统存储客户信息时,我倾向于
在单独的一个数据表里存储姓氏字段,而且还附加起始日和终止日等字段,这样就可以跟踪这一
数据条目的变化。
—ShropshireLad
2.采用有意义的字段名
有一回我参加开发过一个项目,其中有从其他程序员那里继承的程序,那个程序员喜欢用屏幕上
显示数据指示用语命名字段,这也不赖,但不幸的是,她还喜欢用一些奇怪的命名法,其命名采
用了匈牙利命名和控制序号的组合形式,比如cbo1、txt2、txt2_b等等。
除非你在使用只面向你的缩写字段名的系统,否则请尽可能地把字段描述的清楚些。当然,也别
做过头了,比如Customer_Shipping_Address_Street_Line_1I虽然很富有说明性,但没人愿意
键入这么长的名字,具体尺度就在你的把握中。
—LamontAdams
3.采用前缀命名
如果多个表里有好多同一类型的字段(比如FirstName),你不妨用特定表的前缀(比如
CusLastName)来帮助你标识字段。
—notoriousDOG
时效性数据应包括“最近更新日期/时间”字段。时间标记对查找数据问题的原因、按日期重新处
理/重载数据和清除旧数据特别有用。
—kol
5.标准化和数据驱动
数据的标准化不仅方便了自己而且也方便了其他人。比方说,假如你的用户界面要访问外部数据
源(文件、XML文档、其他数据库等),你不妨把相应的连接和路径信息存储在用户界面支持表
里。还有,如果用户界面执行工作流之类的任务(发送邮件、打印信笺、修改记录状态等),那
么产生工作流的数据也可以存放在数据库里。预先安排总需要付出努力,但如果这些过程采用数
据驱动而非硬编码的方式,那么策略变更和维护都会方便得多。事实上,如果过程是数据驱动
的,你就可以把相当大的责任推给用户,由用户来维护自己的工作流过程。
—tduvall
6.标准化不能过头
对那些不熟悉标准化一词(normalization)的人而言,标准化可以保证表内的字段都是最基础的
要素,而这一措施有助于消除数据库中的数据冗余。标准化有好几种形式,但ThirdNormal
Form(3NF)通常被认为在性能、扩展性和数据完整性方面达到了最好平衡。简单来说,3NF规
定:
表内的每一个值都只能被表达一次。
表内的每一行都应该被唯一的标识(有唯一键)。
表内不应该存储依赖于其他键的非键信息。
遵守3NF标准的数据库具有以下特点:有一组表专门存放通过键连接起来的关联数据。比方说,
某个存放客户及其有关定单的3NF数据库就可能有两个表:Customer和Order。Order表不包
含定单关联客户的任何信息,但表内会存放一个键值,该键指向Customer表里包含该客户信息
的那一行。
更高层次的标准化也有,但更标准是否就一定更好呢?答案是不一定。事实上,对某些项目来
说,甚至就连3NF都可能给数据库引入太高的复杂性。
—LamontAdams
为了效率的缘故,对表不进行标准化有时也是必要的,这样的例子很多。曾经有个开发财务分析
软件的活就是用非标准化表把查询时间从平均40秒降低到了两秒左右。虽然我不得不这么做,
但我绝不把数据表的非标准化当作当然的设计理念。而具体的操作不过是一种派生。所以如果表
出了问题重新产生非标准化的表是完全可能的。
—epepke
7.MicrosoftAccess报表技巧
如果你正在使用MicrosoftAccess,你可以用对用户友好的字段名来代替编号的名称:比如用
CustomerName代替txtCNaM。这样,当你用向导程序创建表单和报表时,其名字会让那些不
是程序员的人更容易阅读。
—jwoodruf
8.不活跃或者不采用的指示符
增加一个字段表示所在记录是否在业务中不再活跃挺有用的。不管是客户、员工还是其他什么
人,这样做都能有助于再运行查询的时候过滤活跃或者不活跃状态。同时还消除了新用户在采用
数据时所面临的一些问题,比如,某些记录可能不再为他们所用,再删除的时候可以起到一定的
防范作用。
—theoden
9.使用角色实体定义属于某类别的列
在需要对属于特定类别或者具有特定角色的事物做定义时,可以用角色实体来创建特定的时间关
联关系,从而可以实现自我文档化。
这里的含义不是让PERSON实体带有Title字段,而是说,为什么不用PERSON实体和
PERSON_TYPE实体来描述人员呢?然后,比方说,当JohnSmith,Engineer提升为John
Smith,Director乃至最后爬到JohnSmith,CIO的高位,而所有你要做的不过是改变两个表
PERSON和PERSON_TYPE之间关系的键值,同时增加一个日期/时间字段来知道变化是何时
发生的。这样,你的PERSON_TYPE表就包含了所有PERSON的可能类型,比如Associate、
Engineer、Director、CIO或者CEO等。
还有个替代办法就是改变PERSON记录来反映新头衔的变化,不过这样一来在时间上无法跟踪
个人所处位置的具体时间。
—teburlew
10.采用常用实体命名机构数据
组织数据的最简单办法就是采用常用名字,比如: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等。
采用一般抽象术语来标识“事物”的类别可以让你在关联数据以满足业务要求方面获得巨大的灵
活性,同时这样做还可以显著降低数据存储所需的冗余量。
—teburlew
11.用户来自世界各地
在设计用到网络或者具有其他国际特性的数据库时,一定要记住大多数国家都有不同的字段格
式,比如邮政编码等,有些国家,比如新西兰就没有邮政编码一说。
—billh
12.数据重复需要采用分立的数据表
如果你发现自己在重复输入数据,请创建新表和新的关系。
—AlanRash
13.每个表中都应该添加的3个有用的字段
dRecordCreationDate,在VB下默认是Now(),而在SQLServer下默认为GETDATE()
sRecordCreator,在SQLServer下默认为NOTNULLDEFAULTUSER
nRecordVersion,记录的免费主机域名版本标记;有助于准确说明记录中出现null数据或者丢失数据的原

—PeterRitchie
14.对地址和电话采用多个字段
描述街道地址就短短一行记录是不够的。Address_Line1、Address_Line2和Address_Line3可
以提供更大的灵活性。还有,电话号码和邮件地址最好拥有自己的数据表,其间具有自身的类型
和标记类别。
—dwnerd
过分标准化可要小心,这样做可能会导致性能上出现问题。虽然地址和电话表分离通常可以达到
最佳状态,但是如果需要经常访问这类信息,或许在其父表中存放“首选”信息(比如
Customer等)更为妥当些。非标准化和加速访问之间的妥协是有一定意义的。
—dhattrem
15.使用多个名称字段
我觉得很吃惊,许多人在数据库里就给name留一个字段。我觉得只有刚入门的开发人员才会这
么做,但实际上网上这种做法非常普遍。我建议应该把姓氏和名字当作两个字段来处理,然后在
查询的时候再把他们组合起来。
—klempan
Klempan不是唯一一个注意到使用单个name字段的人,要把这种情况变得对用户更为友好有好
些方法。我最常用的是在同一表中创建一个计算列,通过它可以自动地连接标准化后的字段,这
样数据变动的时候它也跟着变。不过,这样做在采用建模软件时得很机灵才行。总之,采用连接
字段的方式可以有效的隔离用户应用和开发人员界面。
—damon
16.提防大小写混用的对象名和特殊字符
过去最令我恼火的事情之一就是数据库里有大小写混用的对象名,比如CustomerData。这一问
题从Access到Oracle数据库都存在。我不喜欢采用这种大小写混用的对象命名方法,结果还不
得不手工修改名字。想想看,这种数据库/应用程序能混到采用更强大数据库的那一天吗?采用全
部大写而且包含下划符的名字具有更好的可读性(CUSTOMER_DATA),绝对不要在对象名的
字符之间留空格。
—bfren
17.小心保留词
要保证你的字段名没有和保留词、数据库系统或者常用访问方法冲突,比如,最近我编写的一个
ODBC连接程序里有个表,其中就用了DESC作为说明字段名。后果可想而知!DESC是
DESCENDING缩写后的保留词。表里的一个SELECT*语句倒是能用,但我得到的却是一大堆
毫无用处的信息。
—DanielJordan
18.保持字段名和类型的一致性
在命名字段并为其指定数据类型的时候一定要保证一致性。假如字段在某个表中叫做
“agreement_number”,你就别在另一个表里把名字改成“ref1”。假如数据类型在一个表里
是整数,那在另一个表里可就别变成字符型了。记住,你干完自己的活了,其他人还要用你的数
据库呢。
—setanta
19.仔细选择数字类型
在SQL中使用smallint和tinyint类型要特别小心,比如,假如你想看看月销售总额,你的总额字
段类型是smallint,那么,如果总额超过了$32,767你就不能进行计算操作了。
—egermain
20.删除标记
在表中包含一个“删除标记”字段,这样就可以把行标记为删除。在关系数据库里不要单独删除
某一行;最好采用清除数据程序而且要仔细维护索引整体性。
—kol
21.避免使用触发器
触发器的功能通常可以用其他方式实现。在调试程序时触发器可能成为干扰。假如你确实需要采
用触发器,你最好集中对它文档化。
—kol
22.包含版本机制
建议你在数据库中引入版本控制机制来确定使用中的数据库的版本。无论如何你都要实现这一要
求。时间一长,用户的需求总是会改变的。最终可能会要求修改数据库结构。虽然你可以通过检
查新字段或者索引来确定数据库结构的版本,但我发现把版本信息直接存放到数据库中不更为方
便吗?。
—RichardFoster
23.给文本字段留足余量
ID类型的文本字段,比如客户ID或定单号等等都应该设置得比一般想象更大,因为时间不长你
多半就会因为要添加额外的字符而难堪不已。比方说,假设你的客户ID为10位数长。那你应该
把数据库表字段的长度设为12或者13个字符长。这算浪费空间吗?是有一点,但也没你想象的
那么多:一个字段加长3个字符在有1百万条记录,再加上一点索引的情况下才不过让整个数据
库多占据3MB的空间。但这额外占据的空间却无需将来重构整个数据库就可以实现数据库规模
的增长了。
—tlundin
24.列命名技巧
我们发现,假如你给每个表的列名都采用统一的前缀,那么在编写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*fromCustomer,Order
Wherecu_surname=”MYNAME”
andcu_name_id=or_cust_name_id
andor_quantity=1;
在没有这些前缀的情况下则写成这个样子:
Select*fromCustomer,Order
WhereCustomer.surname=”MYNAME”
andCustomer.name_id=Order.cust_name_id
andOrder.quantity=1
第1个SQL语句没少键入多少字符。但如果查询涉及到5个表乃至更多的列你就知道这个技巧
多有用了。
—BryceStenberg
第3部分—选择键和索引
1.数据采掘要预先计划
我所在的市场部门一度要处理8万多份联系方式,同时填写每个客户的必要数据(这绝对不是小
活)。我从中还要确定出一组客户作为市场目标。当我从最开始设计表和字段的时候,我试图不
在主索引里增加太多的字段以便加快数据库的运行速度。然后我意识到特定的组查询和信息采掘
既不准确速度也不快。结果只好在主索引中重建而且合并了数据字段。我发现有一个指示计划相
当关键——当我想创建系统类型查找时为什么要采用号码作为主索引字段呢?我可以用传真号码
进行检索,但是它几乎就象系统类型一样对我来说并不重要。采用后者作为主字段,数据库更新
后重新索引和检索就快多了。
—hscovell
可操作数据仓库(ODS)和数据仓库(DW)这两种环境下的数据索引是有差别的。在DW环境
下,你要考虑销售部门是如何组织销售活动的。他们并不是数据库管理员,但是他们确定表内的
键信息。这里设计人员或者数据库工作人员应该分析数据库结构从而确定出性能和正确输出之间
的最佳条件。
—teburlew
2.使用系统生成的主键
这一天类同技巧1,但我觉得有必要在这里重复提醒大家。假如你总是在设计数据库的时候采用
系统生成的键作为主键,那么你实际控制了数据库的索引完整性。这样,数据库和非人工机制就
有效地控制了对存储数据中每一行的访问。
采用系统生成键作为主键还有一个优点:当你拥有一致的键结构时,找到逻辑缺陷很容易。
—teburlew
3.分解字段用于索引
为了分离命名字段和包含字段以支持用户定义的报表,请考虑分解其他字段(甚至主键)为其组
成要素以便用户可以对其进行索引。索引将加快SQL和报表生成器脚本的执行速度。比方说,
我通常在必须使用SQLLIKE表达式的情况下创建报表,因为casenumber字段无法分解为
year、serialnumber、casetype和defendantcode等要素。性能也会变坏。假如年度和类型字
段可以分解为索引字段那么这些报表运行起来就会快多了。
—rdelval
4.键设计4原则
为关联字段创建外键。
所有的键都必须唯一。
避免使用复合键。
外键总是关联唯一的键字段。
—PeterRitchie
5.别忘了索引
索引是从数据库中获取数据的最高效方式之一。95%的数据库性能问题都可以采用索引技术得到
解决。作为一条规则,我通常对逻辑主键使用唯一的成组索引,对系统键(作为存储过程)采用
唯一的非成组索引,对任何外键列采用非成组索引。不过,索引就象是盐,太多了菜就篌了。你
得考虑数据库的空间有多大,表如何进行访问,还有这些访问是否主要用作读写。
—tduvall
大多数数据库都索引自动创建的主键字段,但是可别忘了索引外键,它们也是经常使用的键,比
如运行查询显示主表和所有关联表的某条记录就用得上。还有,不要索引memo/note字段,不
要索引大型字段(有很多字符),这样作会让索引占用太多的存储空间。
—gbrayton
6.不要索引常用的小型表
不要为小型数据表设置任何键,假如它们经常有插入和删除操作就更别这样作了。对这些插入和
删除操作的索引维护可能比扫描表空间消耗更多的时间。
—kbpatel
7.不要把社会保障号码(SSN)选作键
永远都不要使用SSN作为数据库的键。除了隐私原因以外,须知政府越来越趋向于不准许把
SSN用作除收入相关以外的其他目的,SSN需要手工输入。永远不要使用手工输入的键作为主
键,因为一旦你输入错误,你唯一能做的就是删除整个记录然后从头开始。
—teburlew
上个世纪70年代我还在读大学的时候,我记得那时SSN还曾被用做学号,当然尽管这么做是非
法的。而且人们也都知道这是非法的,但他们已经习惯了。后来,随着盗取身份犯罪案件的增
加,我现在的大学校园正痛苦地从一大摊子数据中把SSN删除。
—generalist
8.不要用用户的键
在确定采用什么字段作为表的键的时候,可一定要小心用户将要编辑的字段。通常的情况下不要
选择用户可编辑的字段作为键。这样做会迫使你采取以下两个措施:
在创建记录之后对用户编辑字段的行为施加限制。假如你这么做了,你可能会发现你的应用程
序在商务需求突然发生变化,而用户需要编辑那些不可编辑的字段时缺乏足够的灵活性。当用
户在输入数据之后直到保存记录才发现系统出了问题他们该怎么想?删除重建?假如记录不可
重建是否让用户走开?
提出一些检测和纠正键冲突的方法。通常,费点精力也就搞定了,但是从性能上来看这样做的
代价就比较大了。还有,键的纠正可能会迫使你突破你的数据和商业/用户界面层之间的隔
离。
所以还是重提一句老话:你的设计要适应用户而不是让用户来适应你的设计。
—LamontAdams
不让主键具有可更新性的原因是在关系模式下,主键实现了不同表之间的关联。比如,
Customer表有一个主键CustomerID,而客户的定单则存放在另一个表里。Order表的主键可能
是OrderNo或者OrderNo、CustomerID和日期的组合。不管你选择哪种键设置,你都需要在
Order表中存放CustomerID来保证你可以给下定单的用户找到其定单记录。
假如你在Customer表里修改了CustomerID,那么你必须找出Order表中的所有相关记录对其进
行修改。否则,有些定单就会不属于任何客户——数据库的完整性就算完蛋了。
如果索引完整性规则施加到表一级,那么在不编写大量代码和附加删除记录的情况下几乎不可能
改变某一条记录的键和数据库内所有关联的记录。而这一过程往往错误丛生所以应该尽量避免。
—ljboast
9.可选键有时可做主键
记住,查询数据的不是机器而是人。
假如你有可选键,你可能进一步把它用做主键。那样的话,你就拥有了建立强大索引的能力。这
样可以阻止使用数据库的人不得不连接数据库从而恰当的过滤数据。在严格控制域表的数据库
上,这种负载是比较醒目的。如果可选键真正有用,那就是达到了主键的水准。
我的看法是,假如你有可选键,比如国家表内的state_code,你不要在现有不能变动的唯一键上
创建后续的键。你要做的无非是创建毫无价值的数据。比如以下的例子:
Selectcount(*)
fromaddress,state_ref
where
address.state_id=state_ref.state_id
andstate_ref.state_code=’TN’
我的做法是这样的:
Selectcount(*) 免费主机域名
fromaddress
where
andstate_code=’TN’
如你因为过度使用表的后续键建立这种表的关联,操作负载真得需要考虑一下了。
—Stocker
10.别忘了外键
大多数数据库索引自动创建的主键字段。但别忘了索引外键字段,它们在你想查询主表中的记录
及其关联记录时每次都会用到。还有,不要索引memo/notes字段而且不要索引大型文本字段
(许多字符),这样做会让你的索引占据大量的数据库空间。。
—gbrayton
第4部分—保证数据的完整性
1.用约束而非商务规则强制数据完整性
如果你按照商务规则来处理需求,那么你应当检查商务层次/用户界面:如果商务规则以后发生变
化,那么只需要进行更新即可。
假如需求源于维护数据完整性的需要,那么在数据库层面上需要施加限制条件。
如果你在数据层确实采用了约束,你要保证有办法把更新不能通过约束检查的原因采用用户理解
的语言通知用户界面。除非你的字段命名很冗长,否则字段名本身还不够。—LamontAdams
只要有可能,请采用数据库系统实现数据的完整性。这不但包括通过标准化实现的完整性而且还
包括数据的功能性。在写数据的时候还可以增加触发器来保证数据的正确性。不要依赖于商务层
保证数据完整性;它不能保证表之间(外键)的完整性所以不能强加于其他完整性规则之上。
—PeterRitchie
2.分布式数据系统
对分布式系统而言,在你决定是否在各个站点复制所有数据还是把数据保存在一个地方之前应该
估计一下未来5年或者10年的数据量。当你把数据传送到其他站点的时候,最好在数据库字段
中设置一些标记。在目的站点收到你的数据之后更新你的标记。为了进行这种数据传输,请写下
你自己的批处理或者调度程序以特定时间间隔运行而不要让用户在每天的工作后传输数据。本地
拷贝你的维护数据,比如计算常数和利息率等,设置版本号保证数据在每个站点都完全一致。
—SuhairTechRepublic
3.强制指示完整性
没有好办法能在有害数据进入数据库之后消除它,所以你应该在它进入数据库之前将其剔除。激
活数据库系统的指示完整性特性。这样可以保持数据的清洁而能迫使开发人员投入更多的时间处
理错误条件。
—kol
4.关系
如果两个实体之间存在多对一关系,而且还有可能转化为多对多关系,那么你最好一开始就设置
成多对多关系。从现有的多对一关系转变为多对多关系比一开始就是多对多关系要难得多。
—CSDataArchitect
5.采用视图
为了在你的数据库和你的应用程序代码之间提供另一层抽象,你可以为你的应用程序建立专门的
视图而不必非要应用程序直接访问数据表。这样做还等于在处理数据库变更时给你提供了更多的
自由。
—GayHowe
6.给数据保有和恢复制定计划
考虑数据保有策略并包含在设计过程中,预先设计你的数据恢复过程。采用可以发布给用户/开发
人员的数据字典实现方便的数据识别同时保证对数据源文档化。编写在线更新来“更新查询”供
以后万一数据丢失可以重新处理更新。
—kol
7.用存储过程让系统做重活
解决了许多麻烦来产生一个具有高度完整性的数据库解决方案之后,我所在的团队决定封装一些
关联表的功能组,提供一整套常规的存储过程来访问各组以便加快速度和简化客户程序代码的开
发。在此期间,我们发现3GL编码器设置了所有可能的错误条件,比如以下所示:
SELECTCnt=COUNT(*)
FROM[感谢各位的阅读,以上就是“数据库设计的方法有哪些”的内容了,经过本文的学习后,相信大家对数据库设计的方法有哪些这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是云技术,小编将为大家推送更多相关知识点的文章,欢迎关注!免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@byun.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。云技术公众号手机网站二维码Copyright Yisu Cloud Ltd. All Rights Reserved. 2018 版权所有广州云技术计算有限公司粤ICP备17096448号-1
粤公网安备 44010402001142号增值电信业务经营许可证编号:B1-20181529

相关推荐: 怎么解决oracle12c将一个11.2.0.1的数据泵导出文件导入12.1.0.2版本报错

本篇内容主要讲解“怎么解决oracle12c将一个11.2.0.1的数据泵导出文件导入12.1.0.2版本报错”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么解决oracle12c将一个11.2.0.1的数据泵导…

文章页内容下
赞(0) 打赏
版权声明:本站采用知识共享、学习交流,不允许用于商业用途;文章由发布者自行承担一切责任,与本站无关。
文章页正文下
文章页评论上

云服务器、web空间可免费试用

宝塔面板主机、支持php,mysql等,SSL部署;安全高速企业专供99.999%稳定,另有高防主机、不限制内容等类型,具体可咨询QQ:360163164,Tel同微信:18905205712

主机选购导航云服务器试用

登录

找回密码

注册