选择“正确的”数据库通常对于应用程序的成功至关重要。下面是一些非常重要的问题:
存储多少数据
如果您的估计数以GB计算或更少为单位,那么几乎任何数据库都可以处理您的数据,甚至内存数据库是完全可行的。当然也有许多数据库选项可以处理TB级的数据。
如果您的答案以PB计算(百万兆字节)或更多为单位,那么只有少数几个数据库将为您提供良好的服务,并且您需要为大量数据存储成本做好准备,无论是内部存储的资本支出还是用于内部存储的运营支出。
需要多少并发用户
来自多个并发用户的负载通常被视为要在安装生产数据库之前需要进行精细计算的。
然而很多时候,我们无法正确评估一个应用到底需要多少并发量,因为有些时候,我们的用户量是会发生变化的,这个时候需要我们的数据库可以支持伸缩扩展。
伸缩灵活性
尽管并非每个应用程序都需要以99.999%的可用性运行24/7,但有些应用程序却需要。只要您在多个可用性区域中运行它们,一些云数据库就可以提供“五个九”的可用性。通常,可以将本地数据库配置为在计划的维护时段之外实现高可用性,尤其是在您可以负担得起建立多个备份服务器的情况下。
从历史上看,NoSQL数据库的可伸缩性(尤其是水平可伸缩性)比SQL数据库要好,但是一些SQL数据库正在追赶。动态可伸缩性在云中更容易实现。具有良好可伸缩性的数据库可以通过向上或向外扩展满足同时处理许多用户。
每个用户操作都将应该具有亚秒级的响应时间,分析查询通常可能需要几秒钟或几分钟。
OLTP数据库的吞吐量通常以每秒事务数来衡量。具有高吞吐量的数据库可以支持更多并发用户。
对于SQL数据库,数据一致性通常是最重要的,这意味着所有读取都将返回最新数据。对于NoSQL数据库,数据只要最终一致性就可以。最终的一致性提供了较低的延迟,但存在读取过时的数据的风险。
数据库架构稳定性
如果您的数据库模式不太可能随着时间的推移发生显着变化,并且您希望大多数字段在记录之间保持一致的类型,那么SQL数据库将是您的理想选择。否则,NoSQL数据库(其中一些甚至不支持架构)可能对您的应用程序更好。但是也有例外。例如,Rockset允许SQL查询,而无需在其导入的数据上施加固定的架构或一致的类型。
用户的地理分布
当您的数据库用户遍布世界各地时,除非您在他们的区域中提供其他服务器,否则最好选择光缆来为用户提供较低的数据库延迟。
OLTP,OLAP或HTAP?
您的应用程序是否需要数据库支持事务,分析或两者兼而有之。需要快速的事务意味着快速的写入速度和最小的索引。需要分析意味着读取速度快并且索引很多。混合系统使用各种技巧来满足这两个要求,包括让主事务存储通过复制为辅助分析存储提供服务。
读写比
一些数据库在读取和查询方面速度更快,而一些数据库则在写入方面速度更快。索引类型的最佳选择在需要大量读取的应用程序(通常是B树)和需要大量写入的应用程序(通常是日志结构的合并树,也称为LSM树)之间有所不同。
地理空间索引和查询
如果您具有地理或几何数据,并且想要执行有效的查询以查找边界内的对象或位置的给定距离内的对象,则与典型关系数据相比,您需要的索引不同。 R树通常是地理空间索引的首选选择,但是有十多种其他可能的地理空间索引数据结构。有几十个支持空间数据的数据库。大多数支持部分或全部开放地理空间联盟标准。
全文索引和查询
同样,对文本字段进行有效的全文搜索需要的索引比关系或地理空间数据要不同。通常,您构建标记词的倒排列表索引,并进行搜索以避免进行昂贵的表扫描。
首选编程语言
尽管大多数数据库都支持许多编程语言的API,但是应用程序中首选的编程语言有时会影响数据库的选择。例如,JSON是JavaScript的自然数据格式,因此您可能希望选择一个支持JavaScript应用程序的JSON数据类型的数据库。当您使用强类型的编程语言时,您可能希望选择一个强类型的数据库。
预算限制
数据库的价格从免费到高昂的付费版本。许多数据库既有免费版本又有付费版本,有时具有不止一个级别的付费产品,例如,提供企业版和不同的服务响应时间。此外,云中的某些数据库可以按需付费。
如果选择免费的开放源数据库,则可能不得不放弃供应商支持。只要您具有内部专业知识,那也可以。另一方面,让您的员工专注于应用程序,而将数据库管理和维护留给供应商或云提供商,可能会更有效率。
法律的限制
有关数据安全和隐私的法律很多。在欧盟,GDPR对隐私,数据保护和数据位置具有广泛的影响。在美国,HIPAA规定医疗信息,而GLBA规定金融机构处理客户私人信息的方式。在加利福尼亚,新的CCPA增强了隐私权和消费者保护。
只要您遵循最佳实践,某些数据库就能以符合某些或所有这些法规的方式处理数据。其他数据库也存在缺陷,无论您多么小心,都很难将其用于个人身份信息。
数据库的选择需要考虑的因素非常的多,我们几乎永远无法考虑到所有的情况。但是我们可以尽量避免那些常见的问题,这样我们的应用至少可以长期稳定的运行。