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

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


当前回答

基本的索引

当看到一个表或整个数据库没有索引,或者索引是任意的/无用的时,我总是感到震惊。即使你不是在设计数据库,只是需要编写一些查询,至少理解以下内容仍然是至关重要的:

数据库中索引了什么,没有索引什么: 扫描类型之间的差异,它们是如何选择的,以及您编写查询的方式如何影响这种选择; 覆盖率的概念(为什么你不应该只写SELECT *); 聚类索引和非聚类索引之间的区别; 为什么更多/更大的指数不一定更好; 为什么应该尽量避免在函数中包装筛选器列。

设计人员还应该注意常见的索引反模式,例如:

Access反模式(逐个索引每一列) Catch-All反模式(在所有或大多数列上建立一个大型索引,显然是在错误的印象中创建的,认为它会加速涉及这些列的所有可以想象的查询)。

数据库索引的质量——以及您在编写查询时是否利用了它——是迄今为止最重要的性能部分。在SO和其他论坛上发布的抱怨性能不佳的问题中,10个问题中有9个总是被证明是由于索引不好或表达式不sargable。

其他回答

非唯一索引中的列顺序很重要。

第一列应该是其内容(即基数)变化最大的列。

这是为了帮助SQL Server在运行时如何使用索引创建有用的统计数据。

我希望每个人,包括dba和开发人员/设计人员/架构师,都能更好地理解如何正确地对业务领域建模,以及如何将业务领域模型映射/转换为规范化的数据库逻辑模型、优化的物理模型和适当的面向对象类模型(每种模型由于各种原因(可能)不同),并理解何时、为什么以及它们(或应该)如何彼此不同。

好问题。以下是一些想法,排名不分先后:

Normalization, to at least the second normal form, is essential. Referential integrity is also essential, with proper cascading delete and update considerations. Good and proper use of check constraints. Let the database do as much work as possible. Don't scatter business logic in both the database and middle tier code. Pick one or the other, preferably in middle tier code. Decide on a consistent approach for primary keys and clustered keys. Don't over index. Choose your indexes wisely. Consistent table and column naming. Pick a standard and stick to it. Limit the number of columns in the database that will accept null values. Don't get carried away with triggers. They have their use but can complicate things in a hurry. Be careful with UDFs. They are great but can cause performance problems when you're not aware how often they might get called in a query. Get Celko's book on database design. The man is arrogant but knows his stuff.

非常好的问题。让我们看看,首先,没有完全理解连接的人不应该考虑查询数据库。这就像开车时不知道方向盘和刹车在哪里一样。您还需要了解数据类型以及如何选择最佳数据类型。

开发人员应该了解的另一件事是,在设计数据库时,你应该记住三件事:

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子句并更新整个表的问题之前,请考虑一下您打算如何做到这一点。

永远不要在比生产版本更新的数据库版本中进行开发。永远、永远、永远不要直接针对生产数据库进行开发。

如果没有数据库管理员,请确保有人正在进行备份,并且知道如何恢复备份,并且已经测试过如何恢复备份。

数据库代码就是代码,没有理由不把它像其他代码一样放在源代码控制中。

我只是想指出一个观察结果——似乎大多数的回答都假设数据库与关系数据库是可以互换的。还有对象数据库,平面文件数据库。评估当前软件项目的需求是很重要的。从程序员的角度来看,数据库决策可以推迟到以后。另一方面,数据建模可以在早期实现,并带来很大的成功。

我认为数据建模是一个关键组件,是一个相对较老的概念,但它已经被软件行业中的许多人遗忘了。数据建模,尤其是概念建模,可以揭示系统的功能行为,并可作为开发的路线图。

另一方面,所需的数据库类型可以根据许多不同的因素来确定,包括环境、用户数量和可用的本地硬件(如硬盘空间)。