IndexedDB:将 url 映射到接受的 markdown/HTML 文本格式标签的正确模式
IndexedDB: proper schema to map urls to accepted markdown/HTML text formatting tags
免责声明
I am very new to the concept of object oriented databases and I honestly don't
have much experience with relational databases either.
我正在尝试使用 indexedDB 来存储一些数据客户端,但在我开始使用它之前。我需要决定一个合适的模式。
我需要满足以下用例:
- 我将根据 URL 查询数据库,我需要取回网站在其文本区域中用于降价/HTML 文本格式的所有标签。 (虽然每个命令我只需要一组标签)
目前,我计划让数据库中的每个 url 成为自己的字典键。
例如:
[ youtube.com:{ {command:"bold", open:"*", close:"*" },
{command:"italic", open:"_", close:"_" },
...
},
whosebug.com: { {command:"strong", open:"<strong>", close:"</strong>" },
.....
},
.......
.......
]
任何人都可以指出这种方法的缺陷/建议替代方案并给出解释吗?
出于性能原因,我最终可能会将最内层的字典更改为数组,但我在这里寻找有关一般架构的建议,而不是那个小问题。虽然,对此的建议也将不胜感激。
编辑
既然我对 keyGen 和索引有了更多的了解,我认为肯定有更好的方法来做到这一点。也许我可以将命令名称本身设为 keyPath,并让该键中的每个对象都包含一组标签和一组使用该集合的 url。
加分题:
如果有人碰巧知道一种方法来动态(务实地)检测网站在访问时使用的降价标签(如果它使用任何)那么我将奖励你 9001 独角兽美元。
快速猜测应该是单个对象存储,您可以在其中存储具有两个属性的对象:url 和标签。鉴于每个对象都由 URL 唯一标识,url 属性 将是关键路径。标签 属性 将是一个可变长度的字符串数组。然后您可以拥有其他属性,但这些将是两个重要的属性。
然后您可以在标签 属性 上创建一个索引,并设置多条目标志以启用按标签查询页面。
例如,在onupgradeneeded中,使用:
function onUpgradeNeeded(event) {
var db = event.target.result;
var pageStore = db.createObjectStore('pages', {keyPath: 'url'});
pageStore.createIndex('tagIndex', 'tags', {multiEntry: true});
}
例如,将对象放入商店:
function insertPage(db, page, callback) {
var tx = db.transaction('pages','readwrite');
tx.oncomplete = callback;
var pageStore = tx.objectStore('pages');
pageStore.put(page);
}
var openRequest = indexedDB.open(...);
openRequest.onupgradeneeded = onUpgradeNeeded;
openRequest.onsuccess = function(event) {
var db = event.target.result;
var mockPage = {
url: 'http://www.whosebug.com',
tags: ['bold','comment','italics'],
foo: bar
};
putPage(db, mockPage, function(event) {
console.log('Completed putting %o into pages object store', mockPage);
});
}
按url查询:
function findPageByURLThenHandle(db, url, callback, fallback) {
var tx = db.transaction('pages','readonly');
var pageStore = tx.objectStore('pages');
var request = pageStore.get(url);
request.onsuccess = function(event) {
var page = event.target.result;
if(page) {
callback(page);
} else {
fallback(url);
}
};
}
var openRequest = indexedDB.open(...);
openRequest.onsuccess = function(event) {
var queryURL = 'http://www.whosebug.com';
var db = event.target.result;
findPageByURLThenHandle(db, queryURL, function(page) {
console.log('Found %o for %s', page, queryURL);
}, function(url) {
console.log('Could not find page for url %s', url);
});
};
查找具有给定标签的所有页面:
function handlePagesForTag(db, tag, callback) {
var tx = db.transaction('pages','readonly');
var pageStore = tx.objectStore('pages');
var tagIndex = pageStore.index('tagIndex');
var request = tagIndex.openCursor(tag);
request.onsuccess = function(event) {
var cursor = event.target.result;
if(!cursor) return;
var page = cursor.value;
callback(page);
cursor.continue();
};
}
希望对您有所帮助。
免责声明
I am very new to the concept of object oriented databases and I honestly don't have much experience with relational databases either.
我正在尝试使用 indexedDB 来存储一些数据客户端,但在我开始使用它之前。我需要决定一个合适的模式。
我需要满足以下用例:
- 我将根据 URL 查询数据库,我需要取回网站在其文本区域中用于降价/HTML 文本格式的所有标签。 (虽然每个命令我只需要一组标签)
目前,我计划让数据库中的每个 url 成为自己的字典键。
例如:
[ youtube.com:{ {command:"bold", open:"*", close:"*" },
{command:"italic", open:"_", close:"_" },
...
},
whosebug.com: { {command:"strong", open:"<strong>", close:"</strong>" },
.....
},
.......
.......
]
任何人都可以指出这种方法的缺陷/建议替代方案并给出解释吗?
出于性能原因,我最终可能会将最内层的字典更改为数组,但我在这里寻找有关一般架构的建议,而不是那个小问题。虽然,对此的建议也将不胜感激。
编辑
既然我对 keyGen 和索引有了更多的了解,我认为肯定有更好的方法来做到这一点。也许我可以将命令名称本身设为 keyPath,并让该键中的每个对象都包含一组标签和一组使用该集合的 url。
加分题: 如果有人碰巧知道一种方法来动态(务实地)检测网站在访问时使用的降价标签(如果它使用任何)那么我将奖励你 9001 独角兽美元。
快速猜测应该是单个对象存储,您可以在其中存储具有两个属性的对象:url 和标签。鉴于每个对象都由 URL 唯一标识,url 属性 将是关键路径。标签 属性 将是一个可变长度的字符串数组。然后您可以拥有其他属性,但这些将是两个重要的属性。
然后您可以在标签 属性 上创建一个索引,并设置多条目标志以启用按标签查询页面。
例如,在onupgradeneeded中,使用:
function onUpgradeNeeded(event) {
var db = event.target.result;
var pageStore = db.createObjectStore('pages', {keyPath: 'url'});
pageStore.createIndex('tagIndex', 'tags', {multiEntry: true});
}
例如,将对象放入商店:
function insertPage(db, page, callback) {
var tx = db.transaction('pages','readwrite');
tx.oncomplete = callback;
var pageStore = tx.objectStore('pages');
pageStore.put(page);
}
var openRequest = indexedDB.open(...);
openRequest.onupgradeneeded = onUpgradeNeeded;
openRequest.onsuccess = function(event) {
var db = event.target.result;
var mockPage = {
url: 'http://www.whosebug.com',
tags: ['bold','comment','italics'],
foo: bar
};
putPage(db, mockPage, function(event) {
console.log('Completed putting %o into pages object store', mockPage);
});
}
按url查询:
function findPageByURLThenHandle(db, url, callback, fallback) {
var tx = db.transaction('pages','readonly');
var pageStore = tx.objectStore('pages');
var request = pageStore.get(url);
request.onsuccess = function(event) {
var page = event.target.result;
if(page) {
callback(page);
} else {
fallback(url);
}
};
}
var openRequest = indexedDB.open(...);
openRequest.onsuccess = function(event) {
var queryURL = 'http://www.whosebug.com';
var db = event.target.result;
findPageByURLThenHandle(db, queryURL, function(page) {
console.log('Found %o for %s', page, queryURL);
}, function(url) {
console.log('Could not find page for url %s', url);
});
};
查找具有给定标签的所有页面:
function handlePagesForTag(db, tag, callback) {
var tx = db.transaction('pages','readonly');
var pageStore = tx.objectStore('pages');
var tagIndex = pageStore.index('tagIndex');
var request = tagIndex.openCursor(tag);
request.onsuccess = function(event) {
var cursor = event.target.result;
if(!cursor) return;
var page = cursor.value;
callback(page);
cursor.continue();
};
}
希望对您有所帮助。