不管我们喜欢与否,我们开发人员中的许多人(如果不是大多数的话)都经常使用数据库,或者有一天可能不得不使用数据库。考虑到大量的误用和滥用,以及每天出现的大量与数据库相关的问题,公平地说,有一些概念是开发人员应该知道的——即使他们今天不设计或使用数据库。
关于数据库,开发人员和其他软件专业人员应该知道的一个重要概念是什么?
不管我们喜欢与否,我们开发人员中的许多人(如果不是大多数的话)都经常使用数据库,或者有一天可能不得不使用数据库。考虑到大量的误用和滥用,以及每天出现的大量与数据库相关的问题,公平地说,有一些概念是开发人员应该知道的——即使他们今天不设计或使用数据库。
关于数据库,开发人员和其他软件专业人员应该知道的一个重要概念是什么?
当前回答
归一化
我总是很沮丧地看到有人努力编写一个过度复杂的查询,而这个查询用标准化的设计可以完全简单明了(“显示每个地区的总销售额。”)。
如果您在一开始就理解了这一点,并相应地进行设计,您将在以后为自己省去许多痛苦。在规范化之后,很容易对性能进行反规范化;要规范化一个从一开始就不是这样设计的数据库并不容易。
至少,您应该知道3NF是什么以及如何实现它。对于大多数事务性数据库,这是使查询易于编写和保持良好性能之间的一个很好的平衡。
其他回答
根据我使用关系数据库的经验,每个开发人员都应该知道:
—不同的数据类型:
为正确的工作使用正确的类型将使您的DB设计更健壮,查询更快,生活更轻松。
—了解1xM和MxM:
这是关系数据库的基本功能。您需要理解一对多和多对多关系,并在适当的时候应用它们。
“K.I.S.S.”原则也适用于DB
简单总是最好的。如果你已经学习了数据库是如何工作的,你将避免不必要的复杂性,这将导致维护和速度问题。
——指数:
光知道它们是什么是不够的。你需要知道什么时候使用,什么时候不使用。
另外:
布尔代数是你的朋友 图像:不要将它们存储在DB上。不要问为什么。 用SELECT测试DELETE
首先,开发人员需要了解一些关于数据库的知识。它们不仅仅是输入SQL并得到结果集的神奇设备,而是具有自己的逻辑和癖好的非常复杂的软件。
其次,针对不同的目的有不同的数据库设置。如果有可用的数据仓库,则不希望开发人员从联机事务数据库生成历史报告。
第三,开发人员需要了解基本的SQL,包括连接。
除此之外,它还取决于开发人员参与的程度。我曾经工作过,我是开发人员,实际上是DBA, DBA只是在走道的另一边,而DBA则在各自的领域。(我不喜欢第三个。)假设开发人员参与了数据库设计:
他们需要了解基本的标准化,至少是前三种标准形式。除此之外,请找一个DBA。对于那些有过美国法庭(以及随便看的电视节目)经验的人来说,有一句便于记忆的话:“依靠钥匙,全部的钥匙,除了钥匙别无其他,帮你一把,科德。”
他们需要了解索引,我的意思是他们应该知道他们需要什么索引,以及它们可能如何影响性能。这意味着不要使用无用的索引,但不要害怕添加它们来辅助查询。任何进一步的工作(如余额)都应该留给DBA。
他们需要理解对数据完整性的需求,并能够指出他们在哪里验证数据,以及如果发现问题他们正在做什么。这并不一定要在数据库中(在数据库中很难向用户发出有意义的错误消息),但必须在某个地方。
他们应该具备如何制定计划的基本知识,以及如何大体阅读计划(至少足以判断算法是否有效)。
他们应该模糊地知道什么是触发器,什么是视图,以及可以对数据库进行分区。他们不需要任何细节,但他们需要知道如何向DBA询问这些事情。
他们当然应该知道不要干涉生产数据,或生产代码,或类似的东西,他们应该知道所有的源代码都进入VCS。
毫无疑问,我忘记了一些事情,但是一般的开发人员不需要是DBA,前提是手头有一个真正的DBA。
三件事是一个神奇的数字:
数据库也需要版本控制。 游标很慢,您可能不需要它们。 触发器是邪恶的*
*几乎总是
对于一个经常使用数据库(每天或几乎每天编写/维护查询)的中间派专业开发人员,我认为期望应该与任何其他领域相同:你在大学里写过一个。
每个c++极客在大学里都写过一个字符串类。每个图形狂人在大学里都写过一个光线追踪器。每个网络极客在大学里都写过交互式网站(通常在我们有“web框架”之前)。每个硬件书呆子(甚至软件书呆子)在大学里都做过CPU。大学里每个内科医生都解剖过一整具尸体,即使她今天只是给我量血压,告诉我胆固醇太高。为什么数据库会有所不同呢?
不幸的是,由于某种原因,他们今天看起来确实不一样了。人们希望。net程序员知道字符串在C语言中是如何工作的,但是RDBMS的内部结构不应该太关心你。
仅仅通过阅读,甚至从上到下都不可能达到同样的理解水平。但是,如果您从底层开始并理解每个部分,那么就相对容易找出数据库的细节。甚至是许多数据库极客似乎无法理解的事情,比如何时使用非关系数据库。
也许这有点严格,特别是如果你在大学里没有学习计算机科学。我会把它调低一些:你今天完全可以从头开始写一个。我不关心你是否知道PostgreSQL查询优化器的工作原理,但如果你知道足够多的知识自己编写一个,它可能不会与他们所做的有太大的不同。你知道,写一个基本的公式并不难。
永远不要以错误的文本编码插入数据。
一旦您的数据库受到多种编码的污染,您所能做的最好的事情就是应用启发式和手工劳动的某种组合。