찾다
데이터 베이스MySQL 튜토리얼11条重要的数据库设计规则
11条重要的数据库设计规则May 24, 2018 pm 04:11 PM
window데이터 베이스규칙설계입력하다

欢迎进入Windows社区论坛,与300万技术人员互动交流 >>进入 在你开始阅读这篇文章之前,我(指原文作者)得明确地告诉你,我并不是一个数据库设计领域的大师。以下列出的11点是我从自己在平时项目实践和阅读中学习到的经验总结出来的个人见解。我个人认为它

欢迎进入Windows社区论坛,与300万技术人员互动交流  >>进入

    在你开始阅读这篇文章之前,我(指原文作者)得明确地告诉你,我并不是一个数据库设计领域的大师。以下列出的11点是我从自己在平时项目实践和阅读中学习到的经验总结出来的个人见解。我个人认为它们对我的数据库设计提供了很大的帮助。

    我之所以写下这篇长文是因为,很多开发者一参与到数据库设计,就会很自然地把“三范式”当作银弹一样来使用。他们往往认为遵循这个规范就是数据库设计的唯一标准。由于这种心态,他们往往尽管一路碰壁也会坚持把项目做下去。

    如果你对 “三范式” 不清楚,请点击这里一步一步的了解什么是“三范式”。

    大家都说标准规范是重要的指导方针,并且也都这么做,但是死记硬背还是会带来麻烦的。以下11点是我在数据库设计时会优先考虑的规则。

    规则1:弄清楚将要开发的应用程序是什么性质的(OLTP 还是 OLAP)?

    当你要开始设计一个数据库的时候,你应该首先要分析出你为之设计的应用程序是什么类型的,它是“事务处理型”(Transactional)的还是 “分析型” (Analytical)的?你会发现许多开发人员采用标准化做法去设计数据库,而不考虑目标程序是什么类型的。采用这种做法设计的数据库很快就会陷入性能、客户定制化的问题当中。正如前面所说的,这里有两种应用程序类型,“基于事务处理” 和 “基于分析”,下面让我们来了解一下这两种类型究竟说的是什么意思:

    事务处理型:对于这种类型的应用程序,你的用户更关注数据的增查改删(CRUD,Creating/Reading/Updating/Deleting)。这种类型官方称之为 “OLTP”。

    分析型:对于这种类型的应用程序,你的用户更关注数据分析、报表、趋势预测等功能。这一类的数据库的“插入” 和“更新”操作相对来说是比较少的。用户的主要目的是更加快速地查询、分析数据。这种类型官方称之为 “OLAP”。

    那么换句话说,如果你认为插入、更新、删除数据这些操作在你的程序中更为突出的话,那就设计一个规范化的表,否则的话就去创建一个扁平的、不规范化的数据库结构。

    以下这个简单的图表显示了像左边 Names 和 Address这样的简单规范化的表,怎么通过应用不规范化结构来创建一个扁平的表结构。

    规则2:将你的数据按照逻辑意义分成不同的块,让事情做起来更简单

    这个规则其实就是 “三范式”中的第一范式。违反这条规则的一个标志就是:你的查询使用了很多字符串解析函数,例如 substring、charindex 等等。若真如此,那就需要应用这条规则了。

    比如你看到的下面图片中有一个有学生名字的表,如果你想要查询学生名字中包含“Koirala”,但不包含“Harisingh”的记录,你可以想象一下你将会得到什么样的结果。

    所以更好的做法是将这个字段拆分为更深层次的逻辑分块,以便我们的表数据写起来更干净,以及优化查询。

    规则3:不要过度使用“规则 2”

    开发者都是一个很可爱的群体。如果你告诉他们这是一条解决问题的正路,他们就会一直这么做下去,做到过了头导致产生一些不必要的后果。这也可以应用于我们刚刚在前面提到的规则2.当你考虑字段分解时,先暂停一下,并且问问你自己是否真的需要这么做。正如前面所说的,分解应该是要符合逻辑的。

    例如,你可以看到电话号码这个字段,你很少会把电话号码的 ISD 代码单独分开来操作(除非你的应用程序要求这么做)。所以一个很明智的决定就是让它保持原样,否则这会带来更多的问题。

    规则4:把重复、不统一的数据当成你最大的敌人来对待

    集中那些重复的数据然后重构它们。我个人更加担心的是这些重复数据带来的混乱而不是它们占用了多少磁盘空间。

    例如下面这个图表,你可以看到 "5th Standard" 和 "Fifth standard" 是一样的意思,它们是重复数据。现在你可能会说是由于那些录入者录入了这些重复的数据或者是差劲的验证程序没有拦住,让这些重复的数据进入到了你的系统。 现在,如果你想导出一份将原本在用户眼里十分困惑的数据显示为不同实体数据的报告,该怎么做呢?

    解决方法之一是将这些数据完整地移到另外一个主表,然后通过外键引用过来。在下面这个图表中你可以看到我们是如何创建一个名为Standards 的主表,然后同样地使用简单的外键连接过去。

    规则5:当心被分隔符分割的数据,它们违反了“字段不可再分”规则

    前面的规则 2 即“第一范式”说的是避免“重复组”。下面这个图表作为其中的一个例子解释了“重复组”是什么样子的。如果你仔细的观察 Syllabus 这个字段,会发现在这一个字段里实在是填充了太多的数据了。像这些字段就被称为“重复组”了。如果我们又得必须使用这些数据,那么这些查询将会十分复杂并且我也怀疑这些查询会有性能问题。

    这些被塞满了分隔符的数据列需要特别注意。一个较好的办法是将这些字段移到另外一个表中,使用外键连接过去,以便于更好的管理。

    那么,让我们现在就应用规则2(第一范式)“避免重复组” 吧。你可以看到上面这个图表,我创建了一个单独的 Syllabus表,然后使用“多对多” 关系将它与 Subject表关联起来。

    通过这个方法,主表(Student 表)的 Syllabus字段就不再有重复数据和分隔符了。

    规则6:当心那些仅仅部分依赖主键的列

    留心注意那些仅仅部分依赖主键的列。例如上面这个图表,我们可以看到这个表的主键是 Roll No.+Standard.现在请仔细观察 Syllabus 字段,可以看到 Syllabus字段仅仅关联Standard字段而不是直接地关联某个学生Roll No.字段。

    Syllabus 字段关联的是学生正在学习的哪个课程级别字段而不是直接关联到学生本身。那如果明天我们要更新教学大纲(课程)的话还要痛苦地为每个同学也修改一下,这明显是不符合逻辑的(也是不正常的做法)。更有意义的做法是将这些字段从这个表移到另外一个表,然后将它们与 Standard表关联起来。

    你可以看到我们是如何移动 Syllabus 字段并且同样地附上 Standard 表。

    这条规则只不过是 “三范式” 里的 “第二范式”:“所有字段都必须完整地依赖主键而不是部分依赖”。

    规则7:仔细地选择派生列

    如果你正在开发一个 OLTP型的应用程序,那强制不去使用派生字段会是一个很好的思路,除非有迫切的性能要求,比如经常需要求和、计算的 OLAP 程序,为了性能,这些派生字段就有必要存在了。

    通过上面的这个图表,你可以看到 Average 字段是如何依赖 Marks 和 Subjects 字段的。这也是冗余的一种形式。因此对于这样的由其他字段得到的字段,需要思考一下它们是否真的有必要存在。

    这个规则也被称为 “三范式” 里的第三条:“不应该有依赖于非主键的列” . 我的个人看法是不要盲目地运用这条规则,应该要看实际情况,冗余数据并不总是坏的。如果冗余数据是计算出来的,看看实际情况再来决定是否应用这第三范式。

    规则8:如果性能是关键,不要固执地去避免冗余

    不要把“避免冗余”当作是一条绝对的规则去遵循。如果对性能有迫切的需求,考虑一下打破常规。常规情况下你需要做多个表的连接操作,而在非常规的情况下这样的多表连接是会大大地降低性能的。

    规则9:多维数据是各种不同数据的聚合

    OLAP 项目主要是解决多维数据问题。比如你可以看看下面这个图表,你会想拿到每个国家、每个顾客、每段时期的销售额情况。简单的说你正在看的销售额数据包含了三个维度的交叉。

    为这种情况做一个实际的设计是一个更好的办法。简单的说,你可以创建一个简单的主要销售表,它包含了销售额字段,通过外键将其他所有不同维度的表连接起来。

    规则10:将那些键/值表统一起来设计

    很多次我都遇到过这种键/值表。键/值表意味着它有一些键,这些键被其他数据关联着。比如下面这个图表,你可以看到我们有 Currency和 Country这两张表。如果你仔细观察你会发现实际上这些表都只有键和值。

    对于这种表,创建一个主要的表,通过一个 Type字段来区分不同的数据将会更有意义。

    规则11:无限分级结构的数据,引用自己的主键作为外键

    我们会经常碰到一些无限分级结构的数据。例如考虑一个多级销售方案的情况,一个销售人员之下可以有多个销售人员。注意到都是“销售人员”。也就是说数据本身就是一个层级。但是层级不同。这时候我们可以引用自己的主键作为外键来表达这种层级关系,从而达成目的。

    这篇文章的用意不是叫大家不要遵循范式,而是叫大家不要盲目地遵循范式。根据你的项目性质和需要处理的数据类型来做出正确的选择。

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
深入理解MySQL索引优化器工作原理深入理解MySQL索引优化器工作原理Nov 09, 2022 pm 02:05 PM

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了关于索引优化器工作原理的相关内容,其中包括了MySQL Server的组成,MySQL优化器选择索引额原理以及SQL成本分析,最后通过 select 查询总结整个查询过程,下面一起来看一下,希望对大家有帮助。

sybase是什么数据库sybase是什么数据库Sep 22, 2021 am 11:39 AM

sybase是基于客户/服务器体系结构的数据库,是一个开放的、高性能的、可编程的数据库,可使用事件驱动的触发器、多线索化等来提高性能。

visual foxpro数据库文件是什么visual foxpro数据库文件是什么Jul 23, 2021 pm 04:53 PM

visual foxpro数据库文件是管理数据库对象的系统文件。在VFP中,用户数据是存放在“.DBF”表文件中;VFP的数据库文件(“.DBC”)中不存放用户数据,它只起将属于某一数据库的 数据库表与视图、连接、存储过程等关联起来的作用。

数据库系统的构成包括哪些数据库系统的构成包括哪些Jul 15, 2022 am 11:58 AM

数据库系统由4个部分构成:1、数据库,是指长期存储在计算机内的,有组织,可共享的数据的集合;2、硬件,是指构成计算机系统的各种物理设备,包括存储所需的外部设备;3、软件,包括操作系统、数据库管理系统及应用程序;4、人员,包括系统分析员和数据库设计人员、应用程序员(负责编写使用数据库的应用程序)、最终用户(利用接口或查询语言访问数据库)、数据库管理员(负责数据库的总体信息控制)。

microsoft sql server是什么软件microsoft sql server是什么软件Feb 28, 2023 pm 03:00 PM

microsoft sql server是Microsoft公司推出的关系型数据库管理系统,是一个全面的数据库平台,使用集成的商业智能(BI)工具提供了企业级的数据管理,具有使用方便可伸缩性好与相关软件集成程度高等优点。SQL Server数据库引擎为关系型数据和结构化数据提供了更安全可靠的存储功能,使用户可以构建和管理用于业务的高可用和高性能的数据应用程序。

数据库的什么是指数据的正确性和相容性数据库的什么是指数据的正确性和相容性Jul 04, 2022 pm 04:59 PM

数据库的“完整性”是指数据的正确性和相容性。完整性是指数据库中数据在逻辑上的一致性、正确性、有效性和相容性。完整性对于数据库系统的重要性:1、数据库完整性约束能够防止合法用户使用数据库时向数据库中添加不合语义的数据;2、合理的数据库完整性设计,能够同时兼顾数据库的完整性和系统的效能;3、完善的数据库完整性有助于尽早发现应用软件的错误。

go语言可以写数据库么go语言可以写数据库么Jan 06, 2023 am 10:35 AM

go语言可以写数据库。Go语言和其他语言不同的地方是,Go官方没有提供数据库驱动,而是编写了开发数据库驱动的标准接口,开发者可以根据定义的接口来开发相应的数据库驱动;这样做的好处在于,只要是按照标准接口开发的代码,以后迁移数据库时,不需要做任何修改,极大方便了后期的架构调整。

mysql查询慢的因素除了索引,还有什么?mysql查询慢的因素除了索引,还有什么?Jul 19, 2022 pm 08:22 PM

mysql查询为什么会慢,关于这个问题,在实际开发经常会遇到,而面试中,也是个高频题。遇到这种问题,我们一般也会想到是因为索引。那除开索引之外,还有哪些因素会导致数据库查询变慢呢?

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

Dreamweaver Mac版

Dreamweaver Mac版

시각적 웹 개발 도구

SublimeText3 Linux 새 버전

SublimeText3 Linux 새 버전

SublimeText3 Linux 최신 버전

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

SublimeText3 영어 버전

SublimeText3 영어 버전

권장 사항: Win 버전, 코드 프롬프트 지원!

ZendStudio 13.5.1 맥

ZendStudio 13.5.1 맥

강력한 PHP 통합 개발 환경