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 成为自己的字典键。

例如:

[ 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();
  };
}

希望对您有所帮助。