儲存大量使用者加密數據的最佳方式是什麼?
我即將開發一個主要儲存使用者加密數據的應用程序。借助 AES 密鑰對每條數據進行加密,該密鑰本身使用每個授權使用者的公共 RSA 密鑰進行加密。
鑑於未加密的數據量可以忽略不計(可能只有使用者登錄、一些日期和外鍵),我想知道諸如 PostgreSQL 或 MySQL 之類的“標準 DBMS”是否是一個不錯的選擇。
實際上,這些 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——只使用關係數據庫。