Похоже, вы приняли по существу правильное, краткосрочное техническое решение для хранилища данных для своего приложения - вы решили написать собственный инструмент управления хранилищем данных.
Вы сидите на континууме, с возможностью двигаться в любом направлении.
В долгосрочной перспективе вы, вероятно, (почти, но не на 100% наверняка) столкнетесь с проблемами, и может быть лучше перейти на использование существующих решений для хранения данных. Есть определенные, очень распространенные, предсказуемые проблемы с производительностью, с которыми вам придется столкнуться, и вам лучше использовать существующие инструменты, а не использовать собственные.
Похоже, вы написали (небольшую) базу данных специального назначения, встроенную и непосредственно используемую вашим приложением. Я предполагаю, что вы полагаетесь на операционную систему и файловую систему для управления записью и чтением на диске и рассматриваете комбинацию как хранилище данных.
Когда делать то, что ты сделал
Вы сидите в приятном месте для хранения данных. Хранилище данных ОС и файловой системы невероятно удобно, доступно и кроссплатформенно. Комбинация существует уже так давно, что вы наверняка будете поддержаны, и ваше приложение будет работать практически при любой стандартной конфигурации развертывания.
Это также простая комбинация для написания кода - API довольно прост и прост, и для его работы требуется сравнительно мало строк кода.
Как правило, идеально делать то, что вы сделали, когда:
- Прототипирование новых идей
- Создание приложений, которые вряд ли будут нуждаться в масштабировании, с точки зрения производительности
- Ограничен необычными обстоятельствами, такими как нехватка ресурсов для установки базы данных
альтернативы
Вы находитесь на континууме вариантов, и есть два «направления», из которых вы можете пойти отсюда, что я считаю «вниз» и «вверх»:
вниз
Это наименее вероятный вариант, но для полноты картины:
Вы можете, если хотите, выйти из строя , то есть вообще обойти ОС и файловую систему и действительно писать и читать прямо с диска. Этот выбор обычно актуален только в тех случаях, когда требуется чрезвычайная эффективность - например, подумайте о миниатюрном / миниатюрном устройстве MP3- плеера, без достаточного количества оперативной памяти для полнофункциональной ОС или о чем-то вроде Wayback Machine , которая требует невероятно эффективной массы. Операции записи данных (большинство хранилищ данных заменяют более медленные записи на более быстрые чтения, поскольку это наиболее распространенный вариант использования почти во всех приложениях).
вверх
Здесь есть несколько подкатегорий - но они не являются эксклюзивными. Некоторые инструменты охватывают оба, предоставляя некоторые функциональные возможности в каждом, некоторые могут полностью переключиться с работы в одном режиме на работу в другом, а некоторые могут быть наслоены друг на друга, предоставляя различные функциональные возможности различным частям вашего приложения.
Более мощные хранилища данных
Возможно, вам понадобится хранить все большие и большие объемы данных, но при этом вы будете полагаться на свое собственное приложение для управления сложностью манипулирования данными. Вам доступен целый ряд хранилищ ключей и значений с различной степенью поддержки связанных функций. Инструменты NoSQL попадают в эту категорию, как и другие.
Это очевидный путь для увеличения, когда ниже описывается ваше приложение:
- Это необычайно тяжелое чтение
- Вы согласны с обменом на более высокую производительность для более низких (краткосрочных) гарантий согласованности (многие предлагают «возможную согласованность»).
- «Непосредственно» управляет большей частью манипулирования данными и отсутствием согласованности (на практике вы, вероятно, в конечном итоге сначала будете использовать сторонний инструмент, хотя в конечном итоге вы перенесете это в свое приложение или на пользовательский промежуточный уровень) ,
- Вы хотите масштабировать объем хранимых данных и / или вашу возможность поиска по ним с «относительно простыми» требованиями к манипулированию данными.
Здесь есть место для маневра - вы можете улучшить согласованность чтения для медленного чтения. Различные инструменты и опции предоставляют манипуляции с данными API, индексацию и другие параметры, которые могут быть более или менее подходящими для простой написания вашего конкретного приложения. Таким образом, если приведенные выше пункты почти полностью описывают ваше приложение, вы можете быть «достаточно близко», чтобы работать с более мощным решением для хранилища данных.
Хорошо известные примеры: CouchDB , MongoDB , Redis , облачные решения хранения, такие как Microsoft Azure , Google App Data Store и Amazon ECE.
Более сложные механизмы обработки данных
Семейство приложений для хранения данных «SQL», а также ряд других, лучше описываются как инструменты манипулирования данными, чем чистые механизмы хранения. Они предоставляют широкий спектр дополнительных функциональных возможностей, помимо хранения данных, и часто за пределами того, что доступно на стороне хранилища ключей и значений. Вы захотите пойти по этому пути, когда:
- Вы обязательно должны иметь согласованность чтения, даже если это означает, что вы получите удар по производительности.
- Вы хотите эффективно выполнять очень сложные манипуляции с данными - подумайте об очень сложных операциях JOIN и UPDATE, кубах данных и срезах и т. Д.
- Вы согласны с компромиссом между жесткостью и производительностью (подумайте о принудительных, фиксированных форматах хранения данных, таких как таблицы, которые нельзя легко и / или эффективно изменить).
- У вас есть ресурсы для работы с часто более сложным набором инструментов и интерфейсов.
Это более «традиционный» способ мышления в отношении базы данных или хранилища данных, и он существует намного дольше - поэтому здесь доступно много всего, и часто приходится иметь дело с большой сложностью. Это возможно, хотя для этого требуется определенный опыт и знания, а также создание простых решений / избежание значительной части сложности - однако, скорее всего, в конечном итоге вы будете использовать сторонние инструменты и библиотеки, чтобы управлять большей частью этого за вас.
Хорошо известными примерами являются MySQL , SQL Server , база данных Oracle и DB2 .
Аутсорсинг работы
Существует несколько современных сторонних инструментов и библиотек, которые размещаются между вашими инструментами хранения данных и вашим приложением, чтобы помочь вам управлять сложностью.
Вначале они пытаются забрать большую часть или всю работу, связанную с управлением и манипулированием хранилищами данных, и, в идеале, позволяют плавно переходить к сложности только тогда, когда это необходимо. Это активная область предпринимательства и исследований, с несколькими недавними результатами, которые сразу же доступны и применимы.
Хорошо известными примерами являются инструменты MVC ( Django , Yii ), Ruby on Rails и Datomic . Трудно быть справедливым здесь, поскольку есть буквально десятки инструментов и библиотек, которые действуют как обертки вокруг API различных хранилищ данных.
PS: если вы предпочитаете видео тексту, вы можете посмотреть некоторые видео, связанные с базой данных Rich Hickey; он хорошо объясняет большую часть мышления, которое уходит на выбор, проектирование и использование хранилища данных.