【发布时间】:2015-07-09 18:48:28
【问题描述】:
我对 couchDB 还很陌生,我正试图将自己的想法隐藏在 doc _id 的用法上。到目前为止,我阅读和了解到的是,我应该生成一个doc _id,这样我就可以将 B-tree 用于索引/映射。建议使用 Docuri 或 pouchdb/collate 等工具。
让一些代码自己说话:
// define a docuri route
Docuri.routes({
':type/:name/:created_at': 'list'
});
var doc = {};
doc.name = 'Testname_1';
doc.type = 'List';
doc.created_at = Math.floor(Date.now() / 1000);
doc.updated_at = Math.floor(Date.now() / 1000);
doc._id = Docuri.list(doc);
console.log(doc');
// {
// _id: "list/Testname_1/1433973431"
// created_at: 1433973431
// name: "Testname_1"
// type: "list"
// updated_at: 1433973431
// }
接下来我会为列表添加一些项目,具有以下doc 结构。
// define a docuri route
Docuri.routes({
'/:list_id/:type/:item/:created_at': 'item'
});
var doc = {};
doc.item = 'Item_1';
doc.type = 'Item';
doc.list_id = 'List/Testname_1/1433973431';
doc.created_at = Math.floor(Date.now() / 1000);
doc.updated_at = Math.floor(Date.now() / 1000);
doc._id = Docuri.item(doc);
console.log(doc');
// {
// _id: "List/Testname_1/1433973431/Item/Item_1/1433973431"
// list_id: "List/Testname_1/1433973431"
// created_at: 1433973431
// item: "Item_1"
// type: "Item"
// updated_at: 1433973431
// }
问题一
这对于小型数据库来说是一个好的结构吗?
第二个问题
(这主要困扰我)假设我会使用列表 _id 就像 <a href="List/Testname_1/1433973431/">Testname_1</a> 一样。现在如果列表名称发生变化,我是否也应该更改列表_id,然后从相应的项目中更改所有list_id?
这对我来说似乎很奇怪,因为我通常不会更改数据库条目的 ID。
但另一方面,用户会期望 HMTL-Link 对应于他的新 Listname。
也许有人可以将我推向正确的方向,如何管理和使用 couchDB 和 pouchDB 中的_id
编辑
这是我阅读的关于 UUID 的两个教程
在决定使用随机值作为 doc _id 之前,请阅读何时不使用 map reduce 部分
尽可能使用特定于域的文档 ID。对于 CouchDB,最佳实践是使用有意义的 id。
http://docs.ehealthafrica.org/couchdb-best-practices/
在此示例中,每次将文档添加到数据库时,您都可以免费获得所有这些“索引”。与随机生成的 UUID 相比,它不会占用任何额外的磁盘空间,而且您无需等待视图构建完成,也无需了解 map/reduce API。
当然,当您需要按各种条件进行搜索时,这个系统就会开始变得不稳定:例如所有专辑按年份排序,艺术家按年龄排序,等等。而且你只能对字符串进行排序——不能像 map/reduce API 支持的那样对数字、布尔值、数组或任意 JSON 对象进行排序。但是对于很多简单的应用程序,你可以完全不使用 query() API。
性能提示:如果您只是使用随机生成的文档 ID,那么您不仅会错失获得免费索引的机会,还会产生构建索引的开销永远不会使用。因此,请使用和滥用您的文档 ID!
http://pouchdb.com/2014/05/01/secondary-indexes-have-landed-in-pouchdb.html
【问题讨论】: