DB 101:开发人员的数据库基础知识

使用数据库的一些被忽视的方面

... > Original photo by Bernard Hermant on Unsplash

在过去的几周里,我一直在使用数据库,作为我的日常工作的一部分,将我们现有的Postgres 9x数据库迁移到最近的版本,如postgres 13.作为我通常不拥有的很多曝光到我支持的应用程序数据库层,以便在使它们可用和确保迁移脚本等中成功运行。但这种深度潜水使我有时间了解我们的数据库及其结构,并查看我们应用程序的一些内部工作。迄今为止,迄今为止,少数文章(和几个来,留在调整!),但今天我想谈论数据库 - 专门的关系数据库 - 从软件开发人员的角度来看,也许有助于一些新的和有抱负的开发人员了解他们的数据存储一点更好。

为这份工作挑选合适的工具

我想谈论的第一件事可能是这个列表中最具争议的主题,这是为您的应用程序选择合适的数据库。现在,我明白,不是每个人都可以选择为他们的项目选择DB,但我认为了解一些最受欢迎的DB和他们的专业人员/缺点会有所帮助。

首先,有DB类型的问题:关系,非关系(或NoSQL)和键值(或kV)。

作者注意:我要指出的一件事是SQL与NoSQL的二分法是一个错误的错误,因为关系DB不必使用SQL和非关系DBS可以使用SQL。但是,SQL和NoSQL已经成为关系和非关系的速记,因此我将在其余的文章中使用这些术语的这种口语含义。

关系数据库 - 有时缩写为RDBMS或SQL数据库 - 存储两种数据:填充数据库之间的各种数据和这些位之间的关系。这允许SQL DBS在其查询中灵活,并使您更容易获取您要查找的数据,因为数据往往会在表格(或标准化)中超过NoSQL DB。归一化可降低数据冗余并提高数据完整性,因为您只需要每次存储一点数据并简单地引用它所需的位置。SQL DBS的流行示例是PostgreSQL,MariaDB和Microsoft SQL Server。

NoSQL或非关系,数据库有许多不同的口味(太多谈论这里),但可能是最常见的是文档数据库。除了像SQL DB这样的多个表中,数据将全部存储在一起作为文档的数据存储在跨多个表中的数据。文档是半结构化的,因为它们通常存储在某种编码中,如JSON或XML,但编码的数据不需要遵循一致的格式。您可以在单个文档数据库中存储不同类型(或模式)的文档。文档数据库具有灵活性的优势,即SQL DBS没有,并且根据您使用的数据,这可能是一个优势。流行文档数据库是MongoDB,Elasticsearch和Couchbase。

键值存储与NoSQL数据库类似,在技术上说话,文档数据库是KV DB的子集。但是,为了我们的目的,我们将使KV DBS分开,因为它们从应用程序的角度提供不同的目的。键值存储基本上是哈希表,并且在执行查找时可能会非常快。这就是为什么他们常用为应用程序的缓存;他们的阅读表现非常非常好。然而,通常,KV DBS在其特征集中受到限制,因此,与复杂数据一起工作可能比将一些工作卸载到SQL或NoSQL数据库的一些时间和处理密集。一些最受欢迎的钥匙店是Redis,Memcached和领事。

现在我们概述了基本数据库类型,我们如何决定使用哪一个?您想要查看的第一件事是您的数据并确定五件事:

1.将在数据库中存储哪种数据?

你会存储日志文件吗?用户帐户?产品信息?json文件?数据类型将有助于确定SQL或NoSQL数据库是否是正确的选择。

2.将如何存储数据是多么复杂?

我的数据是否可以轻松归一化?如果您的数据无法归一化,那么也许NoSQL数据库是正确的方法。

3.数据是如何制定的?

所有的数据单位都遵循相同的架构吗?是否可以符合列类型?如果数据不统一,则文档数据库可能是正确的选择。

4.需要读或写入的频率?

这个应用程序是否会被读多或写多?写入多的应用程序可能需要在写入重载下执行良好的数据库。

5.是否存在数据库的环境或业务考虑因素?

我们是否有任何合同或许可证,这些合同或许可证会对某个品牌或平台进行决定?退出合同或注意事项可能意味着使用Microsoft SQL Server或Oracle数据库等类似的东西而不是MariaDB等开源。

最终,选择哪个数据库不是我可以在文章中告诉你的东西。在考虑上述所有因素后,开发团队需要由开发团队提出的决定。

管理数据库

问自己的下一个问题是“我如何想要管理我的数据库”?这似乎是一个愚蠢的问题,但是使用SQL查询构造函数或使用全吹或使用全吹或使用完全吹入的SQL查询之间的选择并不是一个简单的问题。等等,orm是什么?

ORM或Object-Relational-Mapper是一种管理数据库中的对象的方法,将数据库构造(表,列等)表示为您所选择的编程语言的对象。通常,表格表示为类,类属性是列,等等。使用ORM可以让生活变得更加容易,特别是在开始时,但ORM也有他们的缺点。

orms通过必要性是通用的。他们必须能够为任何类型的数据处理任何类型的查询,因此,它们倾向于优化灵活性过度性能。使用ORM查询数据,尤其是在大批量生产环境中,可能导致延迟问题,死锁,锁定等,导致您的应用程序来磨损到停止。我已经看到了一些orms做一些非常古怪的东西,如多个嵌套的事务和东西。但他们还有他们的位置。早期开发,原型设计和低批量数据库访问是使用ORM的良好用例。

或者,您可以简单地编写原始SQL。虽然这很可能为您提供最具性能,但它也可能是访问数据的更加艰难的方式。此外,与大多数ORMS不同,它自动转义特殊字符和报价字符串,如果您对您的处理方式(特别是用户提供的数据)不太小心,写入RAW SQL可以将应用程序打开到SQL注入攻击。

中间的某个地方是SQL构造函数。它们提供了一些与ORMS(SQL注入缓解,更常用的查询方式)的一些相同的工具,而没有一些ORMS带到表格的开销。它们基本上是用于构造SQL语句的字符串建设者。它们在ORMS和DIY SQL之间提供中间地面。

索引

了解数据库的最忽略和最重要的方面之一是索引。索引为数据库提供了一种方法,以便在表格中快速查找值而无需迭代表中的所有行。随着数据库需要更新索引查找,折衷折衷所需的存储空间增加了持有索引并增加了写入时间。SQL DB中的大多数表都有一个由数据库自动索引的主键;此外,您可以在要索引的表中指定其他列。

假设您正在使用用户表,并希望在输入用户名时检索用户的电子邮件。我们的表可能看起来像这样:

id*| username | email -------------------------------------------------

1 | user_ted | [email protected]

2 | user_jill | [email protected]

3 | user_annie | [email protected]

在这种情况下,ID是我们的主键,因此自动具有与之相关的索引。但是,您的用户不会提交他们的行身份证,他们将提交他们的用户名。表中只有三行,索引在性能方面都不会多大,但是当表增长到100行时会发生什么? 1,000? 10,000?当表格添加到表时,用户电子邮件的每个查询都需要更长且更延长。通过向用户名列添加索引,我们可以将该查询时间减少到几乎恒定的时间(或o(1))。同样,这需要一些磁盘空间和写性能,但由于我们将更频繁地查找用户,而且我们的折衷是一个非常好的人,只要我们没有被带走。被带走将是添加我们不需要的索引,就像电子邮件上的索引一样,因为我们从未通过电子邮件地址查找。通过添加电子邮件索引,我们将要做的就是添加更多时间来插入和不必要地使用磁盘空间。

HealthChecks.

当您有一个将与数据库有长时间连接的应用程序时,可以定期检查数据库是否仍然可用。根据数据库驱动程序,语言和其他因素,可能有方法很容易执行此操作,如检查打开连接,但有时最简单的是运行DB查询。然而,您运行的疑问是什么取决于您的目标。

目标:我想确保我的所有表都在那里

好的,我理解确保您的数据库处于可用状态的愿望。但是,我不推荐这是常规的健康检查。我会在应用程序启动时执行此类验证步骤。对于一个,获取表列表将在数据库上放置读取负载。它可能很小,但如果你有多个副本的应用程序,同时运行相同的健康检查,那么性能影响将大。但是,如果你真的很冷地这样做,那么请务必记住你可能会看到一个绩效命中。

目标:我想获得数据库统计数据

我喜欢这个。从数据库中获取统计信息,如读/写负载,将是应用程序可以登录以后的消耗的东西。在超出数据库可用性状态的情况下,应用程序本身并不多,但在故障排除时可能有助于帮助。

目标:我只是想确保DB是UP

这可能是最基本和最合乎逻辑的健康检查,至少对我来说。与DB性能或验证或无论如何,其他所有其他工具都可以处理其他所有其他工具。检查基本可用性真的是您的应用程序所关心的唯一作品,所以保持简单是我看来的最佳方式。那么你应该用什么样的查询?好吧,你绝对不想做的是这样的东西:

SELECT * FROM 'Customers';

不不不不。停下来。

是的,这将检查DB是否存在。但它还将为您提供所有客户的列表,这是您的客户群增长,这意味着您的健康检查也将在执行时间内增长。不要这样做。这是我最近看到的真实的东西,所以是的,它确实发生了。相反,最好和最简单的查询是这样的:

SELECT 1;

这基本上是一样的

def my_function(): return

简单,并完成工作。你真的不能比这更好。

总结

这只是略有与数据库一起使用的一切,但我希望它能够对一些经常被忽视的地区提供一些洞察力。请记住:数据库通常将是您申请中的性能瓶颈,因此请妥善处理它们,并始终寻找更快的方法。

有什么我错过了吗?你有什么想见我的封面吗?在评论中让我知道!

(本文由闻数起舞翻译自undefined的文章《DB 101: Databases for Developers》,转载请注明出处,原文链接:https://betterprogramming.pub/db-101-databases-for-developers-f7dc29f46f2c)