不管我们喜欢与否,我们开发人员中的许多人(如果不是大多数的话)都经常使用数据库,或者有一天可能不得不使用数据库。考虑到大量的误用和滥用,以及每天出现的大量与数据库相关的问题,公平地说,有一些概念是开发人员应该知道的——即使他们今天不设计或使用数据库。
关于数据库,开发人员和其他软件专业人员应该知道的一个重要概念是什么?
不管我们喜欢与否,我们开发人员中的许多人(如果不是大多数的话)都经常使用数据库,或者有一天可能不得不使用数据库。考虑到大量的误用和滥用,以及每天出现的大量与数据库相关的问题,公平地说,有一些概念是开发人员应该知道的——即使他们今天不设计或使用数据库。
关于数据库,开发人员和其他软件专业人员应该知道的一个重要概念是什么?
当前回答
非唯一索引中的列顺序很重要。
第一列应该是其内容(即基数)变化最大的列。
这是为了帮助SQL Server在运行时如何使用索引创建有用的统计数据。
其他回答
归一化
我总是很沮丧地看到有人努力编写一个过度复杂的查询,而这个查询用标准化的设计可以完全简单明了(“显示每个地区的总销售额。”)。
如果您在一开始就理解了这一点,并相应地进行设计,您将在以后为自己省去许多痛苦。在规范化之后,很容易对性能进行反规范化;要规范化一个从一开始就不是这样设计的数据库并不容易。
至少,您应该知道3NF是什么以及如何实现它。对于大多数事务性数据库,这是使查询易于编写和保持良好性能之间的一个很好的平衡。
我希望每个人,包括dba和开发人员/设计人员/架构师,都能更好地理解如何正确地对业务领域建模,以及如何将业务领域模型映射/转换为规范化的数据库逻辑模型、优化的物理模型和适当的面向对象类模型(每种模型由于各种原因(可能)不同),并理解何时、为什么以及它们(或应该)如何彼此不同。
每个开发人员都应该知道这是错误的:“分析数据库操作与分析代码完全不同。”
在传统意义上有一个明确的Big-O。当你做一个EXPLAIN PLAN(或等效)时,你看到的是算法。有些算法涉及嵌套循环,并且是O(n ^ 2)。其他算法涉及到b树查找,并且是O(n log n)。
这是非常非常严重的。这是理解为什么索引很重要的关键。这对于理解速度-标准化-非标准化之间的权衡至关重要。这对于理解为什么数据仓库使用星型模式是非常重要的,而星型模式并没有对事务更新进行规范化。
如果您不清楚所使用的算法,请执行以下操作。停止。解释查询执行计划。相应调整指标。
同样,结论是:索引越多越好。
有时,专注于一个操作的索引会降低其他操作的速度。根据这两个操作的比例,添加一个索引可能有良好的效果,也可能没有整体影响,或者对整体性能不利。
对于一些项目,面向对象模型更好。
对于其他项目,关系模型更好。
永远不要以错误的文本编码插入数据。
一旦您的数据库受到多种编码的污染,您所能做的最好的事情就是应用启发式和手工劳动的某种组合。