不管我们喜欢与否,我们开发人员中的许多人(如果不是大多数的话)都经常使用数据库,或者有一天可能不得不使用数据库。考虑到大量的误用和滥用,以及每天出现的大量与数据库相关的问题,公平地说,有一些概念是开发人员应该知道的——即使他们今天不设计或使用数据库。
关于数据库,开发人员和其他软件专业人员应该知道的一个重要概念是什么?
不管我们喜欢与否,我们开发人员中的许多人(如果不是大多数的话)都经常使用数据库,或者有一天可能不得不使用数据库。考虑到大量的误用和滥用,以及每天出现的大量与数据库相关的问题,公平地说,有一些概念是开发人员应该知道的——即使他们今天不设计或使用数据库。
关于数据库,开发人员和其他软件专业人员应该知道的一个重要概念是什么?
当前回答
基本的SQL技能。 索引。 处理DATE/ TIME/ TIMESTAMP的不同形式。 用于您正在使用的平台的JDBC驱动程序文档。 处理二进制数据类型(CLOB、BLOB等)
其他回答
每个开发人员都应该知道这是错误的:“分析数据库操作与分析代码完全不同。”
在传统意义上有一个明确的Big-O。当你做一个EXPLAIN PLAN(或等效)时,你看到的是算法。有些算法涉及嵌套循环,并且是O(n ^ 2)。其他算法涉及到b树查找,并且是O(n log n)。
这是非常非常严重的。这是理解为什么索引很重要的关键。这对于理解速度-标准化-非标准化之间的权衡至关重要。这对于理解为什么数据仓库使用星型模式是非常重要的,而星型模式并没有对事务更新进行规范化。
如果您不清楚所使用的算法,请执行以下操作。停止。解释查询执行计划。相应调整指标。
同样,结论是:索引越多越好。
有时,专注于一个操作的索引会降低其他操作的速度。根据这两个操作的比例,添加一个索引可能有良好的效果,也可能没有整体影响,或者对整体性能不利。
索引的工作原理
这可能不是最重要的,但肯定是最被低估的话题。
索引的问题在于SQL教程通常根本不会提到它们,而且所有的玩具示例都可以在没有索引的情况下工作。
即使更有经验的开发人员也可以编写相当好的(和复杂的)SQL,而不需要了解更多关于索引的知识,而只是“索引使查询更快”。
这是因为SQL数据库作为黑盒的工作做得非常好:
告诉我你需要什么(给我SQL),我来处理。
这可以很好地检索正确的结果。SQL的作者不需要知道系统在幕后做什么——直到一切变得非常缓慢.....
这时索引就成了一个话题。但这通常很晚了,而且某些人(一些公司?)已经遇到了真正的问题。
这就是为什么我认为索引是在使用数据库时不能忘记的首要主题。不幸的是,它很容易忘记。
免责声明
这些论点是从我的免费电子书“使用索引,卢克”的序言中借来的。我花了很多时间来解释索引是如何工作的,以及如何正确地使用它们。
非常好的问题。让我们看看,首先,没有完全理解连接的人不应该考虑查询数据库。这就像开车时不知道方向盘和刹车在哪里一样。您还需要了解数据类型以及如何选择最佳数据类型。
开发人员应该了解的另一件事是,在设计数据库时,你应该记住三件事:
Data integrity - if the data can't be relied on you essentially have no data - this means do not put required logic in the application as many other sources may touch the database. Constraints, foreign keys and sometimes triggers are necessary to data integrity. Don't fail to use them because you don't like them or don't want to be bothered to understand them. Performance - it is very hard to refactor a poorly performing database and performance should be considered from the start. There are many ways to do the same query and some are known to be faster almost always, it is short-sighted not to learn and use these ways. Read some books on performance tuning before designing queries or database structures. Security - this data is the life-blood of your company, it also frequently contains personal information that can be stolen. Learn to protect your data from SQL injection attacks and fraud and identity theft.
在查询数据库时,很容易得到错误的答案。确保完全理解数据模型。请记住,实际决策通常是基于查询返回的数据做出的。当它是错误的,就会做出错误的商业决策。你可能会因为糟糕的询问而杀死一家公司,或者失去一个大客户。数据是有意义的,但开发者往往忘记了这一点。
数据几乎永远不会消失,考虑的是随着时间的推移存储数据,而不是今天如何获取数据。数据库在拥有10万条记录时运行良好,十年后可能就不那么好了。应用程序很少能像数据一样持久。这就是为什么性能设计如此重要的原因之一。
您的数据库可能需要应用程序不需要看到的字段。比如用于复制的guid,插入的日期字段。等。您还可能需要存储更改的历史,以及谁在什么时候做了更改,并能够从这个存储库中恢复坏的更改。在向网站询问如何修复忘记在更新中添加where子句并更新整个表的问题之前,请考虑一下您打算如何做到这一点。
永远不要在比生产版本更新的数据库版本中进行开发。永远、永远、永远不要直接针对生产数据库进行开发。
如果没有数据库管理员,请确保有人正在进行备份,并且知道如何恢复备份,并且已经测试过如何恢复备份。
数据库代码就是代码,没有理由不把它像其他代码一样放在源代码控制中。
关于数据库,开发人员应该知道的第一件事是:数据库是用来干什么的?不是它们如何工作,也不是如何构建它们,甚至不是如何编写代码来检索或更新数据库中的数据。但是它们有什么用呢?
不幸的是,这个问题的答案是一个移动的目标。在数据库的鼎盛时期,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.
即使是像连接如何影响查询性能这样简单的事情,在生产中也是非常宝贵的。许多数据库引擎的许多特性在概念上让事情变得更简单,但如果没有考虑清楚,可能会在性能上带来问题。
了解数据库引擎的执行过程,并为之制定计划。