Этот вопрос является слишком широким, чтобы правильно ответить. Тем не менее, основная концепция, которую следует изучать при переходе с SQL на No-SQL (indexedDB), - это концепция хранилищ объектов. Большинство баз данных SQL являются реляционными и выполняют большую часть работы по оптимизации запросов для вас. indexedDB нет. Таким образом, понятия нормализации и денормализации работают по-другому. Координатор должен четко планировать ваши собственные запросы. В отличие от дизайна приложения/системы, который позволяет использовать простые SQL-запросы, которые разрабатываются в более поздний момент времени и, возможно, даже легко добавляются/меняются в более позднее время, вам действительно нужно сделать много планирования вперед для индексированного DB.
Так что небезопасно говорить, что переход - это просто вопрос создания трех объектов-хранилищ, соответствующих вашим трем реляционным таблицам. Во-первых, нет понятия объединения в индексированный DB, поэтому вы не можете присоединяться к внешним ключам.
Непонятно из вашего вопроса, но ваши 3 таблицы - это клиенты, заказы и файлы. Я выйду на конечность и сделаю некоторые догадки. Готов поспорить, вы могли бы использовать одно хранилище объектов, клиентов. Затем для каждого объекта клиента сохраняются свойства обычного клиента, сохраняются свойства массива заказов и сохраняются свойства массива файлов. В массиве заказов сохраните объекты порядка.
Если ваши файлы бинарные, это не сработает, вам нужно будет использовать blobs и даже столкнуться с проблемами с поддержкой blob в различных версиях браузера indexedDB (некоторые из них поддерживают Chrome, это неясно от версии к версии).
Это предполагает, что ваш типичный план запросов состоит в том, что вам нужно сделать что-то вроде списка заказов для клиента, и это наиболее часто используемый тип запроса.
Если вам нужно что-то сделать через заказы, независимо от того, к кому принадлежит заказ, это не будет работать так хорошо, и вам придется перебирать весь магазин.
Если отношение между клиентами и заказами много для многих, то это также не будет работать так хорошо, из-за необходимости избыточно хранить информацию о заказе на одного клиента.Тем не менее, одна заметка здесь заключается в том, что это избыточное хранилище довольно распространено в базах данных в стиле NoSQL, таких как indexedDB. Цель состоит не в том, чтобы идеально моделировать данные, а для хранения данных таким образом, чтобы ваши наиболее часто возникающие запросы выполнялись быстро (при сохранении правильности).
Edit:
На основе вашего редактирования, я хотел бы предложить простой прототип, который использует три хранилища объектов. На странице просмотра вашего клиента, на которой отображаются данные клиента, просто запустите три отдельных запроса.
- Получите одно сущность из хранилища объектов клиента на основе идентификатора клиента.
- Откройте курсор над заказами и получите все заказы для клиента. В хранилище заказов используйте свойство client-id. Создайте индекс для этого свойства client-id. Откройте курсор над индексом для определенного идентификатора клиента.
- Открыть курсор над хранилищем файлов, используя аналогичную тактику, как # 2.
В вашем слое bizlogic применяйте ограничения данных. Например, при удалении клиента сначала удалите все файлы из хранилища файлов, затем удалите все заказы из магазина заказов, а затем удалите единый клиентский объект из хранилища клиентов.
Я предлагаю не переубеждать его. Это не так сложно. Пока вы не описали что-то похожее на то, что у него будут проблемы с производительностью, поэтому нет необходимости в чем-то более элегантном.
Спасибо за подробный ответ! Мой ответ был слишком длинным для комментария, поэтому я редактировал вопрос. – user3629892
Brilliant, thanx man! Я постараюсь это сделать в свой код. Большое спасибо! – user3629892