Чим локальна сховище відрізняється від індексованого DB?


108

localStorage та indexedDB використовуються для офлайн-зберігання даних у HTML5. Які їх ключові відмінності, і який із них кращий у яких ситуаціях?


16
Близькі виборці: Хоча я повністю розумію, як це здавалося "в першу чергу заснованим на думці" ("в порівнянні" в оригінальній версії не допомогло), дві технології відрізняються і є об'єктивні причини вибору однієї іншої. Користувач221287 виконавши деякі мінімальні попередні дослідження в темі питання і отримавши базове розуміння понять, що стосуються, перш ніж запитати, швидше за все, позбавить вас від голосування та закриття голосів у майбутньому.
янніс

Ви можете перевірити продуктивність між різними варіантами зберігання та у веб-переглядачах тут: nolanlawson.github.io/database-compitation (кредити Нолан Лоусон)
Лукас Баскротто

Відповіді:


121

На поверхні ці дві технології можуть здатися прямо порівнянними, однак якщо ви проведете з ними деякий час, незабаром зрозумієте, що це не так. Вони були розроблені для досягнення подібної мети, зберігання на стороні клієнта, але вони підходять до вирішення цієї задачі з суттєво різних точок зору і найкраще працюють з різними обсягами даних.

localStorage, а точніше веб-сховище , було розроблено для меншої кількості даних. Це, по суті, рядкове зберігання лише з ключовими значеннями , з спрощеним синхронним API. Ця остання частина є ключовою. Хоча в специфікації немає нічого, що забороняло б асинхронне зберігання DOM, в даний час всі реалізації синхронізовані (тобто блокують запити). Навіть якщо ви не заперечували за тим, щоб використовувати накопичувач наївних ключів для більшої кількості даних, ваші клієнти будуть вічно чекати, коли ваша програма завантажиться.

З іншого боку, indexedDB був розроблений для роботи зі значно більшими обсягами даних. По-перше, теоретично він пропонує як синхронний, так і асинхронний API. На практиці, однак, всі поточні реалізації є асинхронними, і запити не блокують інтерфейс користувача від завантаження. Крім того, indexedDB, як видно з назви, надає індекси . Ви можете запускати рудиментарні запити у вашій базі даних та отримувати записи, шукаючи їхні клавіші у визначених діапазонах ключів . indexedDB також підтримує транзакції та надає прості типи (наприклад, дата).

На даний момент indexedDB може здатися найкращим рішенням для будь-якої ситуації коли-небудь. Однак існує штраф за всі його функції: У порівнянні з DOM Storage, його API досить складний. indexedDB передбачає загальне ознайомлення з поняттями бази даних, тоді як із веб-сховищем ви можете перейти прямо. Якщо ви коли-небудь працювали з файлами cookie, у вас не виникне проблем із веб-сховищем. Крім того, загалом вам потрібно буде написати більше коду в indexedDB, щоб досягти точно такого ж результату, як у веб-сховищі (і більше коду = більше помилок). Крім того, емуляція веб-сховища для браузерів, які не підтримують її, є відносно простою. За допомогою indexedDB завдання не вартувало свого часу. Нарешті, перш ніж зануритися в індексований банк, слід спочатку ознайомитися з API квот .

Зрештою, повністю залежить від вас, якщо ви використовуєте Веб-сховище або індексований ДБ або те і інше у своїй програмі. Хорошим випадком використання веб-сховища було б зберігати прості дані сеансу, наприклад ім’я користувача, та зберігати деякі запити до фактичної бази даних. З іншого боку, додаткові функції indexedDB можуть допомогти вам зберігати всі дані, необхідні для роботи програми в автономному режимі.


15
Також IndexedDB підтримується лише останніми браузерами : IE 10+, Chrome 23+, Firefox 10+, Opera 15+ та Android 4.4+.
Девід Харкнесс

1
@yannis, чи є різниця між DOM-пам’яттю та веб-сховищем?
SandroMarques

Вони, здається, однакові. en.wikipedia.org/wiki/Web_storage
Lawliet

Також працівники сервісу можуть користуватися індексованим DB, але не
локальним зберіганням

9

Відповідь @yannis відмінна. Просто хочу додати пару речей.

  1. У кількох ситуаціях, як, наприклад, Service Workers, ви не можете використовувати код блокування, отже, ви не можете використовувати localStorage і повинні використовувати щось на зразок indexedDB.

  2. API для indexedDB є складним і стомлюючим (я б хотів сказати "жахливий", YMMV). Для спрощення API існує декілька "обгорткових" бібліотек, я настійно пропоную переглянути ці.


Ви не можете використовувати код локального зберігання та блокування, чи не зможете ви обмотати код блокування Обіцянням і зробити його неблокуючим?
joedotnot

3

Для мене я виявив, що я можу зберігати краплі в IndexedDB, тоді як у localStorage я можу зберігати лише рядки. Це означає, що IndexdDB краще для бінарних даних, таких як зображення, аудіо та відео. Так, ми можемо зберігати зображення в base64 в localStorage, але краплі будуть меншими та швидшими, оскільки нам не потрібно їх розшифровувати.

Цитата від MDN :

The keys and the values are always strings.

Про IndexedDB :

Any objects supported by the structured clone algorithm can be stored:  
All primitive types However not symbols
Boolean object   
String object    
Date     
RegExp  The lastIndex field is not preserved.
Blob     
File     
FileList     
ArrayBuffer  
ArrayBufferView This basically means all typed arrays like Int32Array etc.
ImageData    
Array    
Object  This just includes plain objects (e.g. from object literals)
Map  
Set

Є це? Що говорить про це документація?
Маєль

Вибачте, додані посилання на документацію.
Віталій Зданевич
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.