我将要开发一个主要存储用户加密数据的应用程序。每条数据都通过 AES 密钥加密,AES 密钥本身使用每个授权用户的公共 RSA 密钥加密。
鉴于非加密数据的数量可以忽略不计(可能只有用户登录、一些日期和外键),我想知道“标准 DBMS”如 PostgreSQL 或 MySQL 是否是一个不错的选择。
事实上,这些 DBMS 经过优化,可以处理不同类型的数据(文本、整数、日期等)、索引、流程演算、聚合等。
就我而言,我将存储的绝大多数数据都是大块的文本(或者可能是二进制数据)。大部分所需的演算将在客户端解密后进行处理。
因此,我将无法解析我的数据。所以即使我有一个庞大的数据库,它也不会被称为“大数据”。但是,我想知道 MongoDb、MemSQL 或其他任何东西是否不是更准确的选择。如果没有,最好的 DBMS 是什么以及将它用于我的目的的最佳方式是什么?
换句话说,我认为每个 DBMS 都必须做出牺牲,以便在最重要的功能上更高效。我也认为上面详述的案例不是那么随意。所以我假设有很多我不需要的功能(或者我不能使用,例如 FULLTEXT 搜索)。另一方面,我可能需要被“标准 DBMS”丢弃的特性。
经验法则:如果您的数据结构良好、众所周知(事先)并且每个条目的大小有限(没有大型 BLOB),那么关系数据库非常擅长存储它。即使您不使用高级索引功能。
管理空间,尤其是数据文件中的空白空间,是一个非常难以解决的问题。关系数据库已经处理这个问题 20 多年了 - 值得为此使用它们。除此之外,关系数据库还可以让您从长期的性能调优历史中获益。它们运行高度优化的本机代码,因此您不必为糟糕的 Java 实现、糟糕的网络堆栈、过度使用 memcpy、垃圾收集、粗锁和新产品(尤其是 noSQL 的东西)往往具有的所有其他病态而挣扎。
要存储加密数据,请使用 BINARY 数据类型。MSSQL、MySQL 和 Postgres 都支持这些类型。您可能不想直接对这些类型进行操作(尽管您可以根据需要进行二进制操作)。另请注意,由于上述所有支持加密库,因此在数据库本身中实现加密/解密相对容易。您还将受益于键/外列的索引,以便您可以快速找到您的数据。关系数据库对于小值类型来说是一个很好的键/值存储——即使在一个小盒子上,SQL Server 也可以轻松地让你每秒超过 1-10M 键/值查找——我希望 MySQL 和 PostGres 能够在相同的范围内提供结果。
也很容易找到可以高效查询关系数据库的程序员。SQL 已经存在很长时间了,它是一种非常强大的语言。MSSQL 甚至会给你自动并行执行。一些程序员不会“理解”它——但如果他们不“理解”,很可能他们也不会理解并行性或 lambda 表达式(现代编码人员的两项关键技能)。
除了所有这些优点之外,您还可以获得适用于所有标准关系数据库的强大备份和监控工具。
所以基本上,除非您有充分的理由使用 NoSQL - 只需使用关系数据库。
| 归档时间: |
|
| 查看次数: |
2926 次 |
| 最近记录: |