Filesystems 如何在dexie.js中为文件系统建模?

Filesystems 如何在dexie.js中为文件系统建模?,filesystems,indexeddb,dexie,Filesystems,Indexeddb,Dexie,我正在尝试使用dexie.js创建一个虚拟文件系统。每个文件和目录至少有2个属性,id和名称。此外,文件将具有包含文件内容的blob属性。但是,我不知道是将目录的子目录存储为目录的多值索引,还是将父目录引用为文件的索引。哪个是更好的选择 我过去的SQL经验告诉我应该使用后者,但我不知道IndexedDB更适合处理哪种情况。我建议使用层次结构,类似于以下内容: const db=new-Dexie('filesystem'); db.version(1).stores({ 档案:` [parent

我正在尝试使用dexie.js创建一个虚拟文件系统。每个文件和目录至少有2个属性,id和名称。此外,文件将具有包含文件内容的blob属性。但是,我不知道是将目录的子目录存储为目录的多值索引,还是将父目录引用为文件的索引。哪个是更好的选择


我过去的SQL经验告诉我应该使用后者,但我不知道IndexedDB更适合处理哪种情况。

我建议使用层次结构,类似于以下内容:

const db=new-Dexie('filesystem');
db.version(1).stores({
档案:`
[parentDir+name],
父目录`
});
通过使用复合索引[parentDir+name],DB将确保没有两个项目共享相同的路径

通过索引parentDir,您可以仅使用索引列出直接子级和递归子级

一些例子:

函数createDir(parentDir,name){
//以下事务将失败,如果
//parentDir+名称组合已存在,或者
//表示一个文件。
返回db.files.add({parentDir,name,type:“dir”});
}
函数createFile(parentDir,filename,blob){
返回db.transaction('rw',db.files,async()=>{
//验证parentDir是否存在并且是否为目录:
const dir=wait db.files.get({
parentDir:parentDir
});
如果(!dir)抛出新错误(“未找到父目录”);
如果(dir.type!=“dir”)抛出新错误(“父项不是dir”);
等待db.files.add({
键入:“文件”,
名称:filename,
parentDir,
斑点
});
});
}
/**列出给定目录中的所有文件和文件夹*/
函数列表目录(dirPath){
返回数据库文件
.where({parentDir:dirPath})
.toArray();
}
/**递归列出给定目录中的所有文件和文件夹*/
函数ListDirectoryRecursive(dirPath){
返回数据库文件
.where('parentDir')
.startsWith(dirPath)
.toArray();
}
移动文件或目录会很快,因为您可以在单个查询中访问整个子树

函数moveDirectory(oldParentDir,name,newParentDir){
返回db.transaction('rw',db.files,async()=>{
//移动目录本身:
等待数据库文件
.where({parentDir:oldParentDir,name:name})
.modify(item=>item.parentDir=newDir);
//移动所有子体:
等待数据库文件
.where('parentDir')
.startsWith(oldParentDir+“/”+名称)
.修改(项目=>
item.parentDir=newParentDir+
item.parentDir.substr(oldParentDir.length)+//条带开始
“/”+项目名称);
});
}