我在破解他人的程序时候,我看到很多人把 SSN 或 ID 还曾被用做系列号,当然尽管这么做是非法的 。而且人们也都知道这是非法的,但他们已经习惯了 。后来,随着盗取身份犯罪案件的增加,我现在的同行正痛苦地从一大摊子数据中把 SSN 或 ID 删除 。
不要用用户的键
在确定采用什么字段作为表的键的时候,可一定要小心用户将要编辑的字段 。通常的情况下不要选择用户可编辑的字段作为键 。这样做会迫使你采取以下两个措施:
- 在创建记录之后对用户编辑字段的行为施加限制 。假如你这么做了,你可能会发现你的应用程序在商务需求突然发生变化,而用户需要编辑那些不可编辑的字段时缺乏足够的灵活性 。当用户在输入数据之后直到保存记录才发现系统出了问题他们该怎么想?删除重建?假如记录不可重建是否让用户走开?
- 提出一些检测和纠正键冲突的方法 。通常,费点精力也就搞定了,但是从性能上来看这样做的代价就比较大了 。还有,键的纠正可能会迫使你突破你的数据和商业/用户界面层之间的隔离 。
所以还是重提一句老话:你的设计要适应用户而不是让用户来适应你的设计 。
假如你在 Customer 表里修改了 CustomerID,那么你必须找出 Order 表中的所有相关记录对其进行修改 。否则,有些定单就会不属于任何客户——数据库的完整性就算完蛋了 。
如果索引完整性规则施加到表一级,那么在不编写大量代码和附加删除记录的情况下几乎不可能改变某一条记录的键和数据库内所有关联的记录 。而这一过程往往错误丛生所以应该尽量避免 。
可选键(候选键)有时可做主键
记住,查询数据的不是机器而是人 。
假如你有可选键,你可能进一步把它用做主键 。那样的话,你就拥有了建立强大索引的能力 。这样可以阻止使用数据库的人不得不连接数据库从而恰当的过滤数据 。在严格控制域表的数据库上,这种负载是比较醒目的 。如果可选键真正有用,那就是达到了主键的水准 。
我的看法是,假如你有可选键,比如国家表内的 state_code,你不要在现有不能变动的唯一键上创建后续的键 。你要做的无非是创建毫无价值的数据 。如你因为过度使用表的后续键[别名]建立这种表的关联,操作负载真得需要考虑一下了 。
别忘了外键
大多数数据库索引自动创建的主键字段 。但别忘了索引外键字段,它们在你想查询主表中的记录及其关联记录时每次都会用到 。还有,不要索引 memo/notes 字段而且不要索引大型文本字段(许多字符),这样做会让你的索引占据大量的数据库空间 。
预告:在第四部分将讨论保证数据完整性,如何保持数据库的清晰和健壮,如何把有害数据降低到最小程度 。
四、保证数据的完整性一个成功的管理系统,是由:[50% 的业务 + 50% 的软件] 所组成,而 50% 的成功软件又有 [25% 的数据库 + 25% 的程序] 所组成,数据库设计的好坏是一个关键 。如果把企业的数据比做生命所必需的血液,那么数据库的设计就是应用中最重要的一部分 。有关数据库设计的材料汗牛充栋,大学学位课程里也有专门的讲述 。不过,就如我们反复强调的那样,再好的老师也比不过经验的教诲 。所以我归纳历年来所走的弯路及体会,并在网上找了些对数据库设计颇有造诣的专业人士给大家传授一些设计数据库的技巧和经验 。精选了其中的 60 个最佳技巧,并把这些技巧编写成了本文,为了方便索引其内容划分为 5 个部分:
第一部分介绍了设计数据库之前12个基本技巧,包括命名规范和明确业务需求等(数据库设计经验谈(1) );第二部分介绍设计数据库表24个指南性技巧,涵盖表内字段设计以及应该避免的常见问题等(数据库设计经验谈 (2) );第三部分主要介绍选择键和索引,包含10个技巧专门涉及系统生成的主键的正确用法,还有何时以及如何索引字段以获得最佳性能等(数据库设计经验谈 (3) ) 。本次第四部分主要讨论保证数据完整性,如何保持数据库的清晰和健壮,如何把有害数据降低到最小程度 。
推荐阅读
- 传世的意义守职循业,来自东方的调和之道
- 茶企提能扩容之道,来自东方的调和之道
- 麻糖,大悟绿茶,金卉庄园都来自哪个城市
- 公司来位腾讯大牛,看完我构建的Spring MVC框架,甩给我一份文档
- 品大悟绿茶悟精彩人生
- 茶叶罐的收藏之道,来自东方的调和之道
- 小巧带快充,续航408公里实惠代步车,养车便宜,实拍奇瑞小蚂蚁
- 优衣库怎么买最划算?如何挑选最便宜的单品?一份省钱攻略奉上
- |别傻了,没有一份工作是不辛苦的
- vivo|来自太空的礼物!vivo X Note联名中国航天:送月球陨石碎片
