`
haitan
  • 浏览: 36609 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

数据库设计经验谈:第3 部分— 选择键和索引

阅读更多

1. 数据采掘要预先计划
  我所在的市场部门一度要处理8 万多份联系方式,同时填写每个客户的必要数据(这绝对不是小活)。我从中还要确定出一组客户作为市场目标。当我从最开始设计表和字段的时候,我试图不在主索引里增加太多的字段以便加快数据库的运行速度。然后我意识到特定的组查询和信息采掘既不准确速度也不快。结果只好在主索引中重建而且合并了数据字段。我发现有一个指示计划相当关键——当我想创建系统类型查找时为什么要采用号码作为主索引字段呢?我可以用传真号码进行检索,但是它几乎就象系统类型一样对我来说并不重要。采用后者作为主字段,数据库更新后重新索引和检索就快多了。
  — hscovell
  可操作数据仓库(ODS)和数据仓库(DW)这两种环境下的数据索引是有差别的。在DW 环境下,你要考虑销售部门是如何组织销售活动的。他们并不是数据库管理员,但是他们确定表内的键信息。这里设计人员或者数据库工作人员应该分析数据库结构从而确定出性能和正确输出之间的最佳条件。
  — teburlew
  2. 使用系统生成的主键
  这一天类同技巧1,但我觉得有必要在这里重复提醒大家。假如你总是在设计数据库的时候采用系统生成的键作为主键,那么你实际控制了数据库的索引完整性。这样,数据库和非人工机制就有效地控制了对存储数据中每一行的访问。
  采用系统生成键作为主键还有一个优点:当你拥有一致的键结构时,找到逻辑缺陷很容易。
  — teburlew
  3. 分解字段用于索引
  为了分离命名字段和包含字段以支持用户定义的报表,请考虑分解其他字段(甚至主键)为其组成要素以便用户可以对其进行索引。索引将加快SQL 和报表生成器脚本的执行速度。比方说,我通常在必须使用SQL LIKE 表达式的情况下创建报表,因为 case number 字段无法分解为year、serial number、case type 和defendant code 等要素。性能也会变坏。假如年度和类型字段可以分解为索引字段那么这些报表运行起来就会快多了。
  — rdelval
  4. 键设计4 原则
  · 为关联字段创建外键。
  · 所有的键都必须唯一。
  · 避免使用复合键。
  · 外键总是关联唯一的键字段。
  — Peter Ritchie
  5. 别忘了索引
  索引是从数据库中获取数据的最高效方式之一。95%的数据库性能问题都可以采用索引技术得到解决。作为一条规则,我通常对逻辑主键使用唯一的成组索引,对系统键(作为存储过程)采用唯一的非成组索引,对任何外键列采用非成组索引。不过,索引就象是盐,太多了菜就篌了。你得考虑数据库的空间有多大,表如何进行访问,还有这些访问是否主要用作读写。
  — tduvall
  大多数数据库都索引自动创建的主键字段,但是可别忘了索引外键,它们也是经常使用的键,比如运行查询显示主表和所有关联表的某条记录就用得上。还有,不要索引memo/note 字段,不要索引大型字段(有很多字符),这样作会让索引占用太多的存储空间。
  — gbrayton
  6. 不要索引常用的小型表
  不要为小型数据表设置任何键,假如它们经常有插入和删除操作就更别这样作了。对这些插入和删除操作的索引维护可能比扫描表空间消耗更多的时间。
  — kbpatel
  7. 不要把社会保障号码(SSN)选作键
  永远都不要使用SSN 作为数据库的键。除了隐私原因以外,须知政府越来越趋向于不准许把SSN 用作除收入相关以外的其他目的,SSN 需要手工输入。永远不要使用手工输入的键作为主键,因为一旦你输入错误,你唯一能做的就是删除整个记录然后从头开始。
  — teburlew
  上个世纪70 年代我还在读大学的时候,我记得那时SSN 还曾被用做学号,当然尽管这么做是非法的。而且人们也都知道这是非法的,但他们已经习惯了。后来,随着盗取身份犯罪案件的增加,我现在的大学校园正痛苦地从一大摊子数据中把SSN 删除。
  — generalist
  8. 不要用用户的键
  在确定采用什么字段作为表的键的时候,可一定要小心用户将要编辑的字段。通常的情况下不要选择用户可编辑的字段作为键。这样做会迫使你采取以下两个措施:
  · 在创建记录之后对用户编辑字段的行为施加限制。假如你这么做了,你可能会发现你的应用程序在商务需求突然发生变化,而用户需要编辑那些不可编辑的字段时缺乏足够的灵活性。当用户在输入数据之后直到保存记录才发现系统出了问题他们该怎么想?删除重建?假如记录不可重建是否让用户走开?
  · 提出一些检测和纠正键冲突的方法。通常,费点精力也就搞定了,但是从性能上来看这样做的代价就比较大了。还有,键的纠正可能会迫使你突破你的数据和商业/用户界面层之间的隔离。
  所以还是重提一句老话:你的设计要适应用户而不是让用户来适应你的设计。
  — Lamont Adams
  不让主键具有可更新性的原因是在关系模式下,主键实现了不同表之间的关联。比如,Customer 表有一个主键CustomerID,而客户的定单则存放在另一个表里。Order 表的主键可能是OrderNo 或者OrderNo、CustomerID 和日期的组合。不管你选择哪种键设置,你都需要在Order 表中存放CustomerID 来保证你可以给下定单的用户找到其定单记录。
  假如你在Customer 表里修改了CustomerID,那么你必须找出Order 表中的所有相关记录对其进行修改。否则,有些定单就会不属于任何客户——数据库的完整性就算完蛋了。
  如果索引完整性规则施加到表一级,那么在不编写大量代码和附加删除记录的情况下几乎不可能改变某一条记录的键和数据库内所有关联的记录。而这一过程往往错误丛生所以应该尽量避免。
  — ljboast
  9. 可选键有时可做主键
  记住,查询数据的不是机器而是人。
  假如你有可选键,你可能进一步把它用做主键。那样的话,你就拥有了建立强大索引的能力。这样可以阻止使用数据库的人不得不连接数据库从而恰当的过滤数据。在严格控制域表的数据库上,这种负载是比较醒目的。如果可选键真正有用,那就是达到了主键的水准。
  我的看法是,假如你有可选键,比如国家表内的state_code,你不要在现有不能变动的唯一键上创建后续的键。你要做的无非是创建毫无价值的数据。比如以下的例子:
  Select count(*)
  from address, state_ref
  where
  address.state_id = state_ref.state_id
  and state_ref.state_code = 'TN'
  我的做法是这样的:
  Select count(*)
  from address
  where
  and state_code = 'TN'
  如你因为过度使用表的后续键建立这种表的关联,操作负载真得需要考虑一下了。
  — Stocker
  10. 别忘了外键
  大多数数据库索引自动创建的主键字段。但别忘了索引外键字段,它们在你想查询主表中的记录及其关联记录时每次都会用到。还有,不要索引memo/notes 字段而且不要索引大型文本字段(许多字符),这样做会让你的索引占据大量的数据库空间。
  — gbrayton

分享到:
评论

相关推荐

    数据库设计经验谈

    使用范式理论指导设计,如第一范式(1NF)、第二范式(2NF)直至第三范式(3NF),有助于保持数据的规范化。 选择键是数据库设计中的重要步骤。主键应具有唯一性、不变性和非空性,可以选择自然键或合成键,但需...

    数据库设计之——数据库设计经验谈

    ### 数据库设计之——数据库设计经验谈 在当今数字化时代,数据成为了企业运营的重要组成部分,而数据库则是管理和存储这些数据的核心工具。一个优秀的数据库设计能够极大地提升系统的性能、可靠性和可扩展性。本文...

    数据库设计经验谈.pdf

    #### 第三部分:选择键 **1. 系统生成的主键** - **选择标准**:选择稳定且唯一的数据元素作为主键。 - **自动生成**:利用数据库自增字段或其他生成机制创建主键。 **2. 索引策略** - **何时索引**:对于频繁...

    数据库设计经验谈.doc

    选择合适的数据库管理系统(DBMS)和设计工具对于数据库设计至关重要。例如,MySQL适合小型到中型企业,而Oracle则适用于大型企业级应用。同时,利用ER图(实体关系图)工具可以帮助可视化和理解数据之间的关系。 ...

    浅谈数据库设计技巧-程序员应该读的

    2. 第三范式(3NF):数据库设计通常追求高规范化,第三范式要求消除非主属性对候选键的传递依赖,以减少数据冗余和提高数据一致性。 二、需求分析与建模 1. 需求收集:了解业务流程,明确数据的来源、处理和存储...

    赢在起点-数据库设计规范 梁敬彬大牛的经验之谈

    4. 规范化理论:数据库设计应遵循第一范式(1NF)、第二范式(2NF)、第三范式(3NF),以及更高的BCNF和4NF,以减少数据冗余和提高数据一致性。 5. 主键与外键:主键用于唯一标识表中每一行,应选择不为空且唯一的...

    DB2 数据库调优浅谈

    - **第三方工具**:市场上也存在很多优秀的第三方性能监控和调优工具,如IBM DB2 Performance Advisor for Databases、Quest Toad for DB2等。 综上所述,DB2数据库调优是一个综合性的工作,需要结合多方面的知识和...

    浅谈互联网+下的学习平台构建.docx

    - **技术选型**:选择合适的编程语言和技术栈,如使用Java或Python等语言进行开发,使用MySQL等数据库管理系统存储数据。 - **安全性设计**:考虑到网络安全的重要性,需要采取相应的措施,如数据加密传输、用户认证...

    ASP.NET编程之道.part1.rar

    经验04 数据库设计经验谈 经验05 项目实战经验谈 第2篇 陷阱或谬误篇 第3章 不可忽视的30个技术陷阱 陷阱01 版本不一致产生的陷阱 陷阱02 结构初始化产生的陷阱 陷阱03 传递派生类产生的陷阱 陷阱04 用DataReader...

    高可用分布式架构设计与实践-内训方案.pdf

    CAP理论是分布式系统理论的重要组成部分,它指出在分布式计算中,一致性(Consistency)、可用性(Availability)和分区容忍性(Partition tolerance)这三个特性不可能同时达到。具体来说,当网络分区发生时,只能...

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    第3章 访问和联结方法 55 3.1 全扫描访问方法 55 3.1.1 如何选择全扫描操作 56 3.1.2 全扫描与舍弃 59 3.1.3 全扫描与多块读取 60 3.1.4 全扫描与高水位线 60 3.2 索引扫描访问方法 65 3.2.1 索引结构 66 ...

    Linux运维趋势第十一期

    ### Linux运维趋势第十一期知识点总结 #### 一、人物访谈:抚琴煮酒谈CDN运维与电子商务运维 **1. CDN与电子商务网站运维差异** - **CDN(Content Delivery Network,内容分发网络)运维特点:** - 高并发处理...

    ArchSummit 北京 2016 PPT 下载合集

    《if...,then no else:谈构建技术体系过程中的抉择》可能是对技术架构设计的深度讨论,强调在面对技术选型时,如何避免不必要的复杂性,通过明确的需求分析和决策流程,建立简洁而高效的技术栈。 58大数据平台的...

Global site tag (gtag.js) - Google Analytics