不管我们喜欢与否,我们开发人员中的许多人(如果不是大多数的话)都经常使用数据库,或者有一天可能不得不使用数据库。考虑到大量的误用和滥用,以及每天出现的大量与数据库相关的问题,公平地说,有一些概念是开发人员应该知道的——即使他们今天不设计或使用数据库。
关于数据库,开发人员和其他软件专业人员应该知道的一个重要概念是什么?
不管我们喜欢与否,我们开发人员中的许多人(如果不是大多数的话)都经常使用数据库,或者有一天可能不得不使用数据库。考虑到大量的误用和滥用,以及每天出现的大量与数据库相关的问题,公平地说,有一些概念是开发人员应该知道的——即使他们今天不设计或使用数据库。
关于数据库,开发人员和其他软件专业人员应该知道的一个重要概念是什么?
当前回答
非唯一索引中的列顺序很重要。
第一列应该是其内容(即基数)变化最大的列。
这是为了帮助SQL Server在运行时如何使用索引创建有用的统计数据。
其他回答
每个开发人员都应该知道这是错误的:“分析数据库操作与分析代码完全不同。”
在传统意义上有一个明确的Big-O。当你做一个EXPLAIN PLAN(或等效)时,你看到的是算法。有些算法涉及嵌套循环,并且是O(n ^ 2)。其他算法涉及到b树查找,并且是O(n log n)。
这是非常非常严重的。这是理解为什么索引很重要的关键。这对于理解速度-标准化-非标准化之间的权衡至关重要。这对于理解为什么数据仓库使用星型模式是非常重要的,而星型模式并没有对事务更新进行规范化。
如果您不清楚所使用的算法,请执行以下操作。停止。解释查询执行计划。相应调整指标。
同样,结论是:索引越多越好。
有时,专注于一个操作的索引会降低其他操作的速度。根据这两个操作的比例,添加一个索引可能有良好的效果,也可能没有整体影响,或者对整体性能不利。
我会说有很强的SQL基础技能。到目前为止,我见过许多对数据库了解不多的开发人员,但总是询问如何制定一个相当简单的查询的技巧。查询并不总是那么容易和简单。在查询规范化良好的数据库时,必须使用多个连接(内部连接、左连接等)。
关于数据库,开发人员应该知道的第一件事是:数据库是用来干什么的?不是它们如何工作,也不是如何构建它们,甚至不是如何编写代码来检索或更新数据库中的数据。但是它们有什么用呢?
不幸的是,这个问题的答案是一个移动的目标。在数据库的鼎盛时期,20世纪70年代到90年代初,数据库是为了共享数据。如果你正在使用一个数据库,而你没有共享数据,那么你要么是在参与一个学术项目,要么就是在浪费资源,包括你自己。建立一个数据库和驯服一个DBMS是如此巨大的任务,就数据被多次利用而言,回报必须与投资相匹配。
Over the last 15 years, databases have come to be used for storing the persistent data associated with just one application. Building a database for MySQL, or Access, or SQL Server has become so routine that databases have become almost a routine part of an ordinary application. Sometimes, that initial limited mission gets pushed upward by mission creep, as the real value of the data becomes apparent. Unfortunately, databases that were designed with a single purpose in mind often fail dramatically when they begin to be pushed into a role that's enterprise wide and mission critical.
关于数据库,开发人员需要了解的第二件事是整个以数据为中心的视图。以数据为中心的世界观不同于以流程为中心的世界观,这是大多数开发人员所学过的最不同的观点。与这个差距相比,结构化编程和面向对象编程之间的差距相对较小。
开发人员需要学习的第三件事是数据建模,包括概念数据建模、逻辑数据建模和物理数据建模。
概念数据建模实际上是从以数据为中心的角度进行需求分析。
逻辑数据建模通常是将特定的数据模型应用于概念数据建模中发现的需求。关系模型的使用比任何其他特定模型都要多,开发人员肯定需要学习关系模型。为一个重要的需求设计一个强大且相关的关系模型并不是一项简单的任务。如果误解了关系模型,就无法构建良好的SQL表。
物理数据建模通常是特定于DBMS的,不需要了解太多细节,除非开发人员同时也是数据库构建者或DBA。开发人员需要了解的是,物理数据库设计可以在多大程度上与逻辑数据库设计分离,以及仅通过调整物理设计就可以在多大程度上生成高速数据库。
开发人员需要了解的下一件事是,虽然速度(性能)很重要,但其他衡量设计好坏的指标更重要,比如修改和扩展数据库范围的能力,或者编程的简单性。
最后,任何与数据库打交道的人都需要明白,数据的价值往往比捕获数据的系统更持久。
唷!
我想这里已经介绍了很多技术细节,我不想再补充了。我想说的一件事是,社交比技术更重要,作为应用程序开发人员,不要陷入“DBA知道最好的”的陷阱。
如果您在查询方面有性能问题,也要解决这个问题。自己进行研究,并要求dba解释发生了什么,以及他们的解决方案是如何解决问题的。
在你做了研究之后,也要提出你自己的建议。也就是说,我试图找到解决问题的合作解决方案,而不是将数据库问题留给dba。
阻抗失配问题,并了解常见缺陷或orm。