不管我们喜欢与否,我们开发人员中的许多人(如果不是大多数的话)都经常使用数据库,或者有一天可能不得不使用数据库。考虑到大量的误用和滥用,以及每天出现的大量与数据库相关的问题,公平地说,有一些概念是开发人员应该知道的——即使他们今天不设计或使用数据库。
关于数据库,开发人员和其他软件专业人员应该知道的一个重要概念是什么?
不管我们喜欢与否,我们开发人员中的许多人(如果不是大多数的话)都经常使用数据库,或者有一天可能不得不使用数据库。考虑到大量的误用和滥用,以及每天出现的大量与数据库相关的问题,公平地说,有一些概念是开发人员应该知道的——即使他们今天不设计或使用数据库。
关于数据库,开发人员和其他软件专业人员应该知道的一个重要概念是什么?
当前回答
关于数据库,开发人员应该知道的第一件事是:数据库是用来干什么的?不是它们如何工作,也不是如何构建它们,甚至不是如何编写代码来检索或更新数据库中的数据。但是它们有什么用呢?
不幸的是,这个问题的答案是一个移动的目标。在数据库的鼎盛时期,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。开发人员需要了解的是,物理数据库设计可以在多大程度上与逻辑数据库设计分离,以及仅通过调整物理设计就可以在多大程度上生成高速数据库。
开发人员需要了解的下一件事是,虽然速度(性能)很重要,但其他衡量设计好坏的指标更重要,比如修改和扩展数据库范围的能力,或者编程的简单性。
最后,任何与数据库打交道的人都需要明白,数据的价值往往比捕获数据的系统更持久。
唷!
其他回答
RDBMS兼容性
查看是否需要在多个RDBMS中运行应用程序。如有,可能需要:
避免RDBMS SQL扩展 消除触发器和存储过程 遵循严格的SQL标准 转换字段数据类型 更改事务隔离级别
否则,这些问题应该分开处理,并开发应用程序的不同版本(或配置)。
避免SQL注入以及如何保护您的数据库
关于以下对Walter M。的回答:
“写得很好!历史视角对于当时没有做数据库工作的人(比如我)来说非常有用。”
历史观点在某种意义上是绝对重要的。“忘记历史的人,注定要重蹈覆辙。”XML重复着过去的层次错误,图形数据库重复着过去的网络错误,OO系统迫使用户使用层次模型,而每个人即使只有十分之一的大脑都应该知道层次模型不适合真实世界的通用表示,等等,等等。
至于问题本身:
每个数据库开发人员都应该知道“关系型”不等于“SQL”。然后他们就会明白为什么他们会被DBMS供应商如此失望,为什么他们应该告诉同样的供应商想出更好的东西(例如真正的关系型DBMS),如果他们想继续从他们的客户那里为这些蹩脚的软件吸走大量的钱)。
每个数据库开发人员都应该了解关系代数的所有知识。这样,就不会再有开发者在Stack Overflow网站上发布“我不知道如何做我的工作,希望别人帮我做”这样的愚蠢问题了。
每个开发人员都应该知道这是错误的:“分析数据库操作与分析代码完全不同。”
在传统意义上有一个明确的Big-O。当你做一个EXPLAIN PLAN(或等效)时,你看到的是算法。有些算法涉及嵌套循环,并且是O(n ^ 2)。其他算法涉及到b树查找,并且是O(n log n)。
这是非常非常严重的。这是理解为什么索引很重要的关键。这对于理解速度-标准化-非标准化之间的权衡至关重要。这对于理解为什么数据仓库使用星型模式是非常重要的,而星型模式并没有对事务更新进行规范化。
如果您不清楚所使用的算法,请执行以下操作。停止。解释查询执行计划。相应调整指标。
同样,结论是:索引越多越好。
有时,专注于一个操作的索引会降低其他操作的速度。根据这两个操作的比例,添加一个索引可能有良好的效果,也可能没有整体影响,或者对整体性能不利。
三件事是一个神奇的数字:
数据库也需要版本控制。 游标很慢,您可能不需要它们。 触发器是邪恶的*
*几乎总是