JavaScript/Node.js保存JSON对象的最佳实践和检索某些值的最有效方法
我正在构建一个Node.js应用程序,它将存储大量数据,因此我想提前计划,并考虑如何构建数据 假设我想保存500000个学生帐户信息:JavaScript/Node.js保存JSON对象的最佳实践和检索某些值的最有效方法,javascript,arrays,database,object,data-structures,Javascript,Arrays,Database,Object,Data Structures,我正在构建一个Node.js应用程序,它将存储大量数据,因此我想提前计划,并考虑如何构建数据 假设我想保存500000个学生帐户信息: ID: unique string, // SID0001 username: string, // moe_kanan password: string, // 123123 Name: string, // Moe kanan Age: int,
ID: unique string, // SID0001
username: string, // moe_kanan
password: string, // 123123
Name: string, // Moe kanan
Age: int, // 1 to 100
grade: string, // A, B, C or D
现在,构造数据以获取特定学生帐户信息的最佳、最快和最有效的方法是什么?例如,如果学生想登录,我们必须检查他们的凭证
因此,如果我们将信息保存为一个学生数组,则必须循环遍历该数组。如果有大量的人同时尝试登录,这会减慢应用程序的速度吗
我想出了两种不同的方法,但我不知道哪一种更快更有效。请在你的回答中解释这一点
1.第一种方法 将它们存储为JSON对象,对象键将是唯一的id-在本例中是学生id。例如:
var database = {}; //NOTICE this is an object
database["SID0001"] = {
"ID": "SID0001",
"username": "moe_kanan",
"password": "123123",
"name": "Moe Kanan",
"age": 99,
"grade": "A"
}
在这个方法中,我不必循环。我只需执行以下操作即可获得凭据:
var username = database["SID0001"].username; //moe-kanan
var password = database["SID0001"].password; //123123
2.第二种方法 请随意添加更好的解决方案:)我真的很感激
注意:请记住,我现在不想使用数据库,但将来我会使用MongoDB。假设您想将数据存储在文件系统中,我假设这些是目录中的平面JSON文件。我们追求的是尽可能高效地检索数据的
O(1)
成本
就我个人而言,我会每行查找一个文件
解决方案,因为它很容易维护和实现
假设每一行都有一个唯一的ID,我们可以将所有文件存储在一个3层的目录树中,其中第一个目录将映射到ID的第一个字符,第二个目录将映射到第二个字符,依此类推:
给定ID0001
,文件路径为:
/storage-directory/0/0/0/0001.json
这样,我们可以在给定ID的一个步骤中检索数据。但是,每个目录中都有50万个文件,因此每个目录中都会有很多文件,因为据我所知,每个ID都用零填充。这会在一定程度上降低性能,因为大多数文件系统不喜欢在一个目录中有太多的文件
我们可以使用确定性散列函数(比如SHA1)对ID进行散列,这样就可以使用更多的字符
SHA1(0000001)
生产82c27eaf3472b30a873d39f4342f5e54de9532b9
因此,该行可以存储为:
/storage-directory/8/2/c/0000001.json
getStudentInfo
方法的简单实现可以是:
this.getStudentInfo = (id) => {
let index = this.sha1Index(id);
let key = index[0]+"/"+index[1]+"/"+index[2]+"/"+id+".json";
return fs.parseJson(this.storageDirectory+"/"+key);
}
您必须确保在计算索引之前始终规范化ID,因为SHA1将为1和001生成不同的哈希,而这是同一行(例如,去掉最左边的0)
祝贺您,您刚刚发明了第一个键值存储。很明显,第一个使用对象的方法比使用数组快得多 时间复杂度是使用哈希映射的
O(1)
,而不是使用数组的O(n)
正如其他人所指出的,唯一真正的答案是你应该使用一个数据库。当我阅读你的问题时,我所想的是“MySQL”。正如其他人所说,哈希映射将是最有效的,但你能为这个Node.js应用服务器端什么都不做吗?SQL非常适合管理这样的大型数据表,尤其是500000?即使是假设,SQL也是您的答案。很明显,哈希映射是最有效的解决方案,因为返回成本是O(1),而数组的返回成本是O(n)。因为我不知道你将在哪里存储这么多的数据,如果你使用了任何值存储(mongodb,redis),返回成本会非常便宜。@mike我想将数据存储在一个文件系统中,并从中读取和写入数据。唯一真正的答案是你应该使用一个数据库。当你知道你将使用数据库时,花时间在最高效、最快的平面文件解决方案上是没有意义的。这就好比当你知道你要飞的时候,你要找出纽约和洛杉矶之间最快、最有效的公路路线。如果你打算将数据写入数据库,那么我建议使用base64编码和解码,在写入数据库之前编码,然后在提取后解码,这将处理所有将破坏数据库查询的字符。迈克,非常感谢你花时间回答我的问题。您能否提供此方法性能的链接和指标?
this.getStudentInfo = (id) => {
let index = this.sha1Index(id);
let key = index[0]+"/"+index[1]+"/"+index[2]+"/"+id+".json";
return fs.parseJson(this.storageDirectory+"/"+key);
}