IndexedDB в качестве бэкэнда для веб-компонента таблицы данных
Я работаю над веб-компонентом таблицы данных / сетки, который поддерживает сортировку, фильтрацию, бесконечную прокрутку и т. Д. Я ищу замену существующей модели данных на IndexedDB (используя Dexie).
Мой первоначальный план состоял в том, чтобы использовать одну базу данных и иметь "таблицу" для каждого компонента. Однако, прочитав документацию, я понял, что каждый раз, когда добавляется новая таблица, версия базы данных повышается.
Что это значит?
- Нужно ли отслеживать этот номер версии?
- Если сетка использует базу данных, а другая сетка обновляет базу данных, будут ли потеряны данные?
- Лучше вместо этого использовать БД для каждого компонента?
Спасибо за любую помощь
1 ответ
Это правда, что схема indexedDB довольно статична. Всякий раз, когда вы должны изменить его, он должен будет закрыть все существующие соединения, которые могут прерывать другие вкладки с загруженным приложением. Если все экземпляры вашего приложения ведут себя одинаково - это близко и динамически открывает свою базу данных каждый раз, когда происходит событие 'versionchange'. Это было бы возможно. Однако длительные транзакции будут блокировать его обновление до тех пор, пока они не будут выполнены.
Мне интересно, что вы пытаетесь достичь. Я полагаю, вы хотите использовать индексы indexedDB для сортировки и подкачки / прокрутки. Но не ясно, есть ли у вас конкретная модель или ваш компонент будет универсальным / адаптированным к какой-либо модели / схеме.
Если ваша модель конкретная, а ваши компоненты специфичны для приложения конечного пользователя. Вы можете смоделировать это статически, используя Dexie (db.version(1).stores(...)). Но когда вы задаете этот вопрос, я полагаю, что вы хотите создать универсальный компонент, вопрос заключается в том, следует ли вам действительно определять схему внутри вашего компонента или, скорее, позволить ее пользователю определить ее и позволить вашему компоненту адаптироваться вместо существующих баз данных. Например, пользователь вашего компонента может захотеть определить базу данных и использовать ваш компонент в качестве средства просмотра данных. Ваш компонент может принимать входные аргументы как таковые:
(databaseName, tableName, columns)
Затем вы можете создать Dexie без указания схемы и просто открыть существующую базу данных:
var db = new Dexie(databaseName);
// Don't specify version() - open dynamically!
db.open().then(db => {
var table = db.table(tableName);
var indexedColumns = table.schema.indexes.map(idx => idx.keyPath);
if (table.schema.primKey.keyPath)
indexedColumns.unshift(table.schema.primKey.keyPath);
}
// Here you can render your columns.
// For each column that also exists in indexedColumns, you can
// orderBy() or put queries based on it.
});
Родственные документы: