不管我们喜欢与否,我们开发人员中的许多人(如果不是大多数的话)都经常使用数据库,或者有一天可能不得不使用数据库。考虑到大量的误用和滥用,以及每天出现的大量与数据库相关的问题,公平地说,有一些概念是开发人员应该知道的——即使他们今天不设计或使用数据库。

关于数据库,开发人员和其他软件专业人员应该知道的一个重要概念是什么?


当前回答

避免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。开发人员需要了解的是,物理数据库设计可以在多大程度上与逻辑数据库设计分离,以及仅通过调整物理设计就可以在多大程度上生成高速数据库。

开发人员需要了解的下一件事是,虽然速度(性能)很重要,但其他衡量设计好坏的指标更重要,比如修改和扩展数据库范围的能力,或者编程的简单性。

最后,任何与数据库打交道的人都需要明白,数据的价值往往比捕获数据的系统更持久。

唷!

除了他们使用的语法和概念选项(例如连接、触发器和存储过程)之外,对于每个使用数据库的开发人员来说,有一件事是至关重要的:

了解您的引擎将如何执行您正在编写的查询。

我认为这很重要的原因仅仅是生产的稳定性。您应该知道您的代码是如何执行的,这样您就不会在等待一个长函数完成时停止线程中的所有执行,那么为什么您不想知道您的查询将如何影响数据库、程序甚至服务器呢?

This is actually something that has hit my R&D team more times than missing semicolons or the like. The presumtion is the query will execute quickly because it does on their development system with only a few thousand rows in the tables. Even if the production database is the same size, it is more than likely going to be used a lot more, and thus suffer from other constraints like multiple users accessing it at the same time, or something going wrong with another query elsewhere, thus delaying the result of this query.

即使是像连接如何影响查询性能这样简单的事情,在生产中也是非常宝贵的。许多数据库引擎的许多特性在概念上让事情变得更简单,但如果没有考虑清楚,可能会在性能上带来问题。

了解数据库引擎的执行过程,并为之制定计划。

了解用于数据库编程的工具!!

我浪费了很多时间试图理解为什么我的代码神秘地失败了。

例如,如果您正在使用。net,您需要知道如何正确使用System.Data.SqlClient名称空间中的对象。您需要知道如何管理SqlConnection对象,以确保它们被打开、关闭,并在必要时正确地处理。

你需要知道,当你使用SqlDataReader时,有必要将它与你的SqlConnection分开关闭。您需要了解如何在适当的时候保持连接打开,以及如何最小化对数据库的访问次数(因为它们在计算时间方面相对昂贵)。

进化数据库设计。http://martinfowler.com/articles/evodb.html

这些敏捷方法使数据库更改过程易于管理、可预测和可测试。

开发人员应该知道,在版本控制、持续集成和自动化测试方面重构生产数据库需要什么。

进化数据库设计过程具有管理方面的问题,例如,在此代码库的所有数据库中,某个列在某个生命周期后将被删除。

至少要知道数据库重构的概念和方法是存在的。 http://www.agiledata.org/essays/databaseRefactoringCatalog.html

分类和过程描述也使得为这些重构实现工具成为可能。

关于以下对Walter M。的回答:

“写得很好!历史视角对于当时没有做数据库工作的人(比如我)来说非常有用。”

历史观点在某种意义上是绝对重要的。“忘记历史的人,注定要重蹈覆辙。”XML重复着过去的层次错误,图形数据库重复着过去的网络错误,OO系统迫使用户使用层次模型,而每个人即使只有十分之一的大脑都应该知道层次模型不适合真实世界的通用表示,等等,等等。

至于问题本身:

每个数据库开发人员都应该知道“关系型”不等于“SQL”。然后他们就会明白为什么他们会被DBMS供应商如此失望,为什么他们应该告诉同样的供应商想出更好的东西(例如真正的关系型DBMS),如果他们想继续从他们的客户那里为这些蹩脚的软件吸走大量的钱)。

每个数据库开发人员都应该了解关系代数的所有知识。这样,就不会再有开发者在Stack Overflow网站上发布“我不知道如何做我的工作,希望别人帮我做”这样的愚蠢问题了。