Мой вопрос касается размещения структуры данных в indexedDB.Я начал создавать небольшую функцию веб-страницы, которая превратилась в нечто большее, чем инструмент веб-обучения, теперь более близкий к автономному прогрессивному веб-приложению.Использование localStorage хорошо сработало, но поскольку инструмент вырос, ограничение в 5 МБ может стать проблемой для некоторых пользователей;поэтому необходимо перейти на indexedDB.
Приложение предназначено только для настольных компьютеров и позволяет пользователю создавать портфель модулей и сохранять данные на жестком диске в виде строки JSON.Когда пользователь открывает (загружает) файл в приложении, строка анализируется, и весь портфель снова записывается в localStorage, но только один модуль записывается в объект времени выполнения одновременно.Нет необходимости в «подлинной» базе данных с точки зрения поиска данных по различным полям и индексации, а только в необходимости большего объема памяти, потому что это будет слишком запутанным для пользователя, если каждый модуль в портфеледолжен быть отдельным файлом.
Большая часть данных, сохраненных в localStorage, получена из трехуровневого объекта, и ключ создается на основе пути к объекту для сохранения и извлечения данных.Например, object.level_1 [key_1] .level_2 [key_2] .level_3 [key_3] .height = 10 сохраняется как localStorage.setItem ('k1.k2.k3.h', 10).
MyВопрос в том, что при переходе к indexedDB это более эффективно: один объектный магазин, очень похожий на настроенный localStorage, или отдельный объектный магазин для каждого из трех уровней портфеля?
Если можно просмотреть один объектный магазинкак аналогично таблице из двух столбцов с одной строкой (ключом и значением) для каждой отдельной точки данных, количество строк будет больше, чем сумма счетчиков строк для трех объектов ObjectStores, где каждая строка является ключом иобъект из нескольких точек данных;но чтобы обновить отдельную точку данных в одном из трех objectStores, объект базы данных необходимо записать во временный объект, обновить точку данных и затем записать обратно в objectStore.
Вопрос в том,затем, что более эффективно: поиск в одной таблице из множества строк одного уникального ключа, указывающего на одно менее сложное значение, или поиск в одной из трех таблиц с меньшим количеством строк, но с необходимостью выполнения того, что я считаю эквивалентным JSONсинтаксический анализ, обновление значения и строковое преобразование JSON для обновления одного и того же значения в базе данных?
Хотя явно не установлено никаких ограничений, ожидаемое максимальное количество объектов уровня_1 в одном портфеле составляет около 25, где каждый из них может содержатьдо 100 объектов level_2, каждый из которых в свою очередь может содержать максимум около 5 объектов level_3.Что-либо большее, чем это, скорее всего, приведет к тому, что пользователь просто создаст отдельные портфели.
Таким образом, хранилище объектов level_1 будет иметь около 25 строк, хранилище объектов level_2 - около 2500 строк, а хранилище объектов level_3 - около 12500 строк.Каждый объект level_1 имеет около 40 точек данных;каждый объект level_2 имеет около 100 точек данных;и каждый объект level_3 имеет около 20 точек данных.Итак, я думаю, что один объектный магазин будет иметь эквивалент (25) (40) + (2500) (100) + (12 500) (20) = 501 000 строк.
Я немного опытен в извлеченииданные используют SQL из очень больших баз данных, но абсолютно ничего не знают о том, как настраивается база данных для поиска данных по ключу.Если бы пришлось искать сверху вниз, проверяя каждую из 501 000 строк, пока не был найден соответствующий ключ, то один объектный магазин кажется довольно нелепым выбором для трех объектных магазинов.Но если indexedDB использует более эффективный метод, то один объектный магазин может быть более эффективным в зависимости от того, насколько эффективно обновить значение свойства в объекте одного из трех объектных магазинов.
По профессии я не программист;Итак, я прошу прощения, если некоторые из моих терминологии неточны, и я понимаю, что мой вопрос имеет довольно базовый уровень;но мне не удалось найти какую-либо информацию, касающуюся того, как «сопоставить» объект с базой данных объектов эффективным способом.
Спасибо за чтение моего вопроса и за любое направление, которое вы можете предоставить.
РЕДАКТИРОВАТЬ / ОБНОВИТЬ:
Спасибо, Джош, за то, что нашли время ответить на мой вопрос и предоставили ряд вопросов для размышления.Я еще не рассматривал, как в какие моменты во время приложения различные типы данных, записываемые в хранилище браузера, влияют на определение количества хранилищ объектов.
Существует два больших перемещения данных, которые обычно происходят только один раз в течение сеанса пользователя: загрузка с жесткого диска строки JSON для анализа и записи в хранилище браузера, а затем чтение хранилища браузера вобъект для строкового преобразования и загрузки на жесткий диск.Пользователи, скорее всего, ожидают, что эти два шага займут как минимум достаточно времени, чтобы потребовать какой-то краткий индикатор прогресса.Важные моменты времени - это время, которое требуется для хранения изменений данных и создания новых элементов данных.
Возможно, после замечаний Джоша хорошим способом настройки хранилищ объектов является рассмотрение того, когда и какие данные записываются в браузер.хранение на экранах, из-за отсутствия лучшего срока.В моем приложении только один модуль (объект level_1 в портфеле) когда-либо загружался в объект времени выполнения.Есть один экран для данных уровня модуля.Когда этот экран закрывается, любые изменения в данных уровня модуля записываются в хранилище.
Каждый объект уровня_2 в модуле имеет свой собственный экран, и, когда пользователь перемещается между экранами объектов уровня_2, содержимое вэлементы экранного ввода проверяются по значениям объекта времени выполнения на предмет изменений, и любые изменения записываются в хранилище.
На экране объекта уровня_2 пользователь добавляет объекты уровня_3 к определенным элементам уровня_2, вызывая окно, котороепоявляется в верхней части экрана level_2.Когда каждое окно закрывается, выполняется аналогичная проверка, и любые изменения данных записываются в хранилище.
Создание хранилищ объектов, которые соответствуют данным, отображаемым и собираемым на каждом экране, имеет смысл и, конечно, выравниваетс уровнями объекта.Тем не менее, он по-прежнему не отвечает, какая структура данных в конечном итоге будет наиболее эффективной, обеспечивая наилучшее взаимодействие с пользователем по времени.
Помимо некоторого практического правила для эффективности базы данных, вероятно, наилучший подход дляМой конкретный вопрос и обстоятельство заключается в том, чтобы закодировать его в обоих направлениях, заполнить портфель большим, чем ожидалось, числом максимальных модулей, объектов level_2 и level_3 и проверить производительность записи и чтения данных в indexedDB.Первый метод хранилища одного объекта должен быть достаточно простым для кодирования, поскольку он настроен почти так же, как localStorage.Второй подход использования как минимум трех хранилищ объектов займет больше времени, но, вероятно, это будет необходимый и полезный опыт обучения для кого-то с моим ограниченным опытом в этих областях.
Если я добьюсь успеха, я поделюсьрезультаты здесь в ближайшее время.Спасибо.
РЕДАКТИРОВАТЬ:
Спасибо за дальнейшие объяснения.Я не собираюсь запрашивать базу данных таким способом, но храню данные для извлечения только на основе уникального ключа.Тем не менее, ваши предыдущие комментарии о хранении одних и тех же данных в нескольких таблицах наконец-то запомнились мне, и я думаю, что это значительно упростило весь мой вопрос и подход.Я слишком много думал с точки зрения локального хранилища.
Я думаю, что будет хорошо работать несколько хранилищ объектов: одно хранилище объектов, которое содержит один полный объект для каждого модуля или данные уровня_1 в портфеле, и три или четыре хранилища объектов, которые содержат подмножества данных для «активного» илитолько загруженный модуль.
Когда пользователь выбирает модуль для загрузки, он будет полностью загружен из хранилища объектов модуля за один шаг, и подмножества (различные уровни объектов) этого модуля будут записаны в ряд различных объектовмагазины.Когда пользователь вносит изменения в данные модуля на любом уровне, эти изменения будут сохраняться в соответствующем хранилище объектов поднабора, поскольку это будет происходить намного быстрее.
Если пользователь должным образом выйдет / закроет модуль, то в это время загруженный объект будет полностью записан в хранилище объектов модуля, а хранилища объектов подмножества будут очищены.Хранилища объектов подмножества предназначены для сохранения изменений в случае, если пользователь не сможет правильно завершить работу или произойдет сбой питания или сбой ОС.
Когда приложение открыто, хранилище браузера будет проверено, чтобы определить, есть ли база данных, и, если да, пустые хранилища объектов подмножества.Если пусто, то было выполнено правильное закрытие и сохранение модуля.Если не пусто, то изменения в модуле по какой-либо причине не попадают в хранилище объектов модуля, и пользователю будет предложено либо восстановить, либо отменить изменения, сохраненные в хранилищах объектов подмножества.Если пользователь выбирает восстановление, то данные в хранилищах объектов подмножества должны быть собраны в единый модуль и записаны в хранилище объектов модуля.
Это должно хорошо работать для ожидаемого максимального размера любого отдельного объекта.модуль в этом приложении;но если размер модуля станет слишком большим для браузера при полной загрузке, то для заполнения экранов можно использовать хранилища подмножества объектов;и когда пользователь выходит из модуля, подмножества могут быть собраны вместе для создания полного набора данных модуля и записаны в хранилище объектов модуля, так же как и для восстановления.
Конечно, нет никакого способаво время выполнения проверьте, работает ли браузер слишком медленно из-за слишком большого модуля, и измените подход в это время.Я просто имею в виду, что если во время моего тестирования больших образцов модулей будет замечено, что браузер работает слишком медленно, тогда потребуется реализовать второй подход.
Я понимаю, что мой конкретный вопрос не так интересен, какпредметы, перечисленные в ответе.Тем не менее, чтение об этих общих понятиях помогло мне лучше понять, как справиться с моим менее интересным использованием indexedDB и избежать значительного количества путаницы по поводу кодирования ненужной сложности для простой проблемы.Еще раз спасибо.