JavaScript/Node.js保存JSON对象的最佳实践和检索某些值的最有效方法

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,

我正在构建一个Node.js应用程序,它将存储大量数据,因此我想提前计划,并考虑如何构建数据

假设我想保存500000个学生帐户信息:

       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的第一个字符,第二个目录将映射到第二个字符,依此类推:

给定ID
0001
,文件路径为:

/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);
}