Не могли бы вы указать на альтернативные инструменты хранения данных и дать веские причины использовать их вместо старых добрых реляционных баз данных? На мой взгляд, большинство приложений редко используют всю мощь SQL - было бы интересно посмотреть, как создать приложение без SQL.


Файловые системы очень удобны для хранения двоичных данных, которые никогда не работают хорошо в реляционных базах данных.
Доброго времени суток,
Я могу вспомнить один случай, когда моделируемые данные не могут быть легко представлены в реляционной базе данных.
Одним из таких примеров является база данных, используемая операторами мобильной связи для мониторинга и управления базовыми станциями мобильных телефонных сетей.
Почти во всех этих случаях используется OO DB, либо коммерческий продукт, либо саморегулирующаяся система, которая допускает иерархию объектов.
Я работал над приложением для мониторинга 3G для крупной компании, которая останется безымянной, но чей логотип представляет собой пятно от красного вина (-:, и они использовали такую объектно-ориентированную базу данных, чтобы отслеживать все различные атрибуты для отдельных ячеек в пределах сеть.
Опрос таких БД выполняется с использованием проприетарных методов, которые, как правило, полностью свободны от SQL.
HTH.
ваше здоровье,
Роб
Обычные текстовые файлы в файловой системе
Файлы XML или JSON на диске
Таблица / файл CSV
Subversion (или аналогичная дисковая система контроля версий)
Berkeley DB (по сути, хеш-таблица на диске)
Хранилище данных Google App Engine
Коллекции на родном языке (хранятся в памяти или сериализуются на диске)
Пользовательский (рукописный) механизм хранения
Я не могу утверждать, что знаю что-то о них много, но вы также можете изучить системы объектных баз данных.
Было бы здорово, если бы вы также объяснили недостатки каждого варианта, иначе как следует выбирать? Спасибо,
Кроме того, запись миллионов строк в БД может занять день, в то время как добавление миллиона строк журнала в файл занимает всего несколько минут. Я никогда не пойму, почему люди настаивают на занесении данных журнала в базу данных.
Аарон: У меня одна причина: ВЫБРАТЬ сообщения ИЗ журнала WHERE (дата МЕЖДУ 2009-01-01 И 2009-03-01) И type = 'error' AND system = 'windows' :) Как бы вы загрузили это из текстового файла ?
Я категорически за текстовые файлы, когда это возможно. Вы не всегда можете использовать их, но когда вы можете, с ними намного легче диагностировать проблемы.
Berkeley db определенно имеет транзакции. текстовые файлы и файлы xml / json этого не делают, поэтому многопоточные приложения могут вытеснить их, если вы не будете осторожны. Файлы CSV прекрасно подходят для сбора параметров, потому что бизнес-пользователи могут просто просматривать их и редактировать без дополнительных инструментов. Текстовые файлы отлично подходят для приложений с однократной записью и почти никогда не считываемых, таких как журналирование. Чтобы выбрать подход, вам нужно выяснить, чего вы пытаетесь достичь
BDB использовался Subversion и больше не используется из-за огромного количества проблем, с которыми сталкиваются пользователи.
Текстовые файлы могут использоваться для регистрации ошибок и по-прежнему запрашиваться, если они хранятся в иерархии каталогов, например. система \ тип ошибки \ год \ месяц \ день \
@jtb, что усложняет просмотр. Например, если вы хотите узнать, что произошло в программе после того, как что-то произошло, вы обычно просматриваете 1 журнал после отметки времени, а затем смотрите, что было сделано до того, как произошла ошибка, а не только ошибка. Вы не можете сортировать их гибко. и всегда есть проблема, если ваше приложение состоит из разных потоков с блокировкой и так далее.
Объектные базы данных не являются реляционными. Они могут быть действительно полезны, если вы просто хотите поместить несколько объектов в базу данных. Они также поддерживают управление версиями и изменяют классы для объектов, которые уже существуют в базе данных. db4o - первое, что приходит на ум.
Вы можете пройти долгий путь, просто используя файлы, хранящиеся в файловой системе. РСУБД становятся все лучше при обработке больших двоичных объектов, но это может быть естественным способом обработки данных изображений и т.п., особенно если запросы просты (перечисление и выбор отдельных элементов).
Другие вещи, которые не очень хорошо подходят для РСУБД, - это иерархические структуры данных, и я предполагаю, что с геопространственными данными и 3D-моделями тоже не так просто работать.
Такие службы, как Amazon S3, предоставляют более простые модели хранения (ключ-> значение), которые не поддерживают SQL. Масштабируемость - ключ к успеху.
Файлы Excel также могут быть полезны, особенно если пользователям необходимо иметь возможность манипулировать данными в знакомой среде, а создание полноценного приложения для этого невозможно.
Попробуйте Превайлер: http://www.prevayler.org/wiki/ Превайлер - это альтернатива РСУБД. На сайте есть больше информации.
Существует множество способов хранения данных - даже «реляционная база данных» охватывает ряд альтернатив от простой библиотеки кода, которая манипулирует локальным файлом (или файлами), как если бы это была реляционная база данных для одного пользователя, через файловые системы, которые могут обслуживать множество пользователей, и широкий выбор серьезных "серверных" систем.
Мы часто используем файлы XML - вы получаете хорошо структурированные данные, хорошие инструменты для запросов, а также возможность вносить изменения, если это необходимо, что-то, что читается человеком, и вам не нужно беспокоиться о работе механизма db (или работы db двигатель). Это хорошо работает для материалов, которые по существу предназначены только для чтения (в нашем случае чаще всего генерируются из базы данных в другом месте), а также для однопользовательских систем, где вы можете просто загрузить данные и сохранить их по мере необходимости - но вы создаете возможности для проблем, если вы хотите многопользовательское редактирование - хотя бы одного файла.
Для нас это все - мы либо собираемся использовать что-то, что будет делать SQL (MS предлагает набор инструментов, которые запускаются из .DLL для выполнения однопользовательских вещей на всем пути до корпоративного сервера, и все они говорят на одном и том же SQL (с ограничениями на нижнем уровне)) или мы собираемся использовать XML в качестве формата, потому что (для нас) многословие редко является проблемой.
В настоящее время нам не нужно манипулировать двоичными данными в наших приложениях, поэтому этот вопрос не возникает.
Мерф
Ответ Мэтта Шеппарда великолепен (модификация), но я бы принял во внимание эти факторы, думая о шпинделе:
Одним из особых преимуществ файлов CSV перед СУБД является то, что их можно легко сжать и перенести практически на любую другую машину. Мы передаем большие объемы данных, и все достаточно просто, мы просто используем один большой CSV-файл, и легко создавать сценарии с помощью таких инструментов, как rsync. Чтобы уменьшить повторение в больших файлах CSV, вы можете использовать что-то вроде YAML. Я не уверен, что буду хранить что-либо вроде JSON или XML, если у вас нет серьезных требований к отношениям.
Что касается не упомянутых альтернатив, не сбрасывайте со счетов Hadoop, который является реализацией MapReduce с открытым исходным кодом. Это должно работать хорошо, если у вас есть ТОННА слабо структурированных данных, которые необходимо проанализировать, и вы хотите быть в сценарии, в котором вы можете просто добавить еще 10 машин для обработки данных.
Например, я начал пытаться анализировать производительность, которая, по сути, представляла собой все временные числа различных функций, зарегистрированных примерно на 20 машинах. После попытки вставить все в СУБД я понял, что мне действительно не нужно снова запрашивать данные после их агрегирования. И для меня это полезно только в агрегированном формате. Итак, я храню файлы журналов в сжатом виде, а затем оставляю агрегированные данные в БД.
Примечание Я больше привык думать с "большими" размерами.
Одна из опасностей CSV-файлов заключается в том, что их нужно избежать; его легко реализовать читатель или писатель CSV, который на самом деле не соответствует спецификации, поскольку он выглядит обманчиво простым и имеет несколько тонкостей: en.wikipedia.org/wiki/Comma-separated_values#Specification
В некоторых случаях (например, данные финансового рынка и управление процессами) вам может потребоваться использовать базу данных реального времени, а не СУБД. См. ссылка вики
Можно было бы рассмотреть использование сервера LDAP вместо традиционной базы данных SQL, если данные приложения в значительной степени ориентированы на ключ / значение и имеют иерархический характер.
Одна из веских причин не использовать реляционную базу данных - это когда у вас большой набор данных и вы хотите выполнять массово параллельную и распределенную обработку данных. Веб-индекс Google был бы прекрасным примером такого случая.
Hadoop также имеет реализацию Файловая система Google, называемую Распределенная файловая система Hadoop.
Файлы BTree часто намного быстрее, чем реляционные базы данных. SQLite содержит в себе библиотеку BTree, которая находится в общественном достоянии (как действительно «общественное достояние», без использования этого термина).
Честно говоря, если бы я хотел многопользовательскую систему, мне нужно было бы много убеждений не использовать приличную серверную реляционную базу данных.
BTrees - это базовая реализация обычных индексов. Oracle поддерживает таблицы с индексированием, которые представляют собой просто таблицу, реализованную как индекс. Их быстрее читать, медленнее писать и использовать B-дерево. См .: oracle.com/technology/products/oracle9i/datasheets/iots/…>
Custom (hand-written) storage engine / Potentially very high performance in required uses cases
Если у вас огромные наборы данных, вы можете использовать HDF, иерархический формат данных, вместо того, чтобы накатывать свои собственные.
http://en.wikipedia.org/wiki/Hierarchical_Data_Format:
HDF supports several different data models, including multidimensional arrays, raster images, and tables.
Он также иерархичен, как файловая система, но данные хранятся в одном волшебном двоичном файле.
HDF5 is a suite that makes possible the management of extremely large and complex data collections.
Подумайте о петабайтах данных дистанционного зондирования NASA / JPL.
Полнотекстовые базы данных, которые можно запрашивать с помощью операторов близости, таких как «в пределах 10 слов от» и т. д.
Реляционные базы данных - идеальный бизнес-инструмент для многих целей - достаточно простой для понимания и проектирования, достаточно быстрый, адекватный, даже если они не были разработаны и оптимизированы гением, который мог бы «использовать всю мощь» и т. д.
Но для некоторых бизнес-целей требуется полнотекстовое индексирование, которое реляционные механизмы либо не предоставляют, либо прибегают к ним второстепенно. В частности, юридическая и медицинская области имеют большой объем неструктурированного текста, который нужно хранить и разбирать.
Несколько лет назад был написан RAD-инструмент под названием ДЖЕЙД, который имеет встроенную OODBMS. Более ранние версии движка DB также поддерживали Digitalk Smalltalk. Если вы хотите создать образец приложения с использованием парадигмы, отличной от РСУБД, это может быть началом.
Другие продукты OODBMS включают Объективность, GemStone (вам нужно будет получить VisualWorks Smalltalk для запуска версии Smalltalk, но есть также версия java). В этом пространстве также было несколько исследовательских проектов с открытым исходным кодом - на ум приходят EXODUS и его потомок SHORE.
К сожалению, эта концепция, казалось, умерла насмерть, вероятно, из-за отсутствия четко видимого стандарта и относительно слабых возможностей специальных запросов по сравнению с системами RDMBS на основе SQL.
OODBMS наиболее подходит для приложений с основными структурами данных, которые лучше всего представлены в виде графа взаимосвязанных узлов. Я имел обыкновение говорить, что типичным приложением OODBMS было многопользовательское подземелье (MUD), где комнаты будут содержать аватары игроков и другие объекты.
Раньше было правдой, что вам нужен был клиент Smalltalk для использования GemStone / S (для настольных приложений), но с веб-фреймворками Aida (aidaweb.si) и Seaside (Seaside.st) GemStone / S можно использовать непосредственно в качестве сервера приложений. См. Информацию о СТЕКЛЕ (Seaside.gemstone.com)
Другой причиной может быть забота о качестве данных. В OODB, таком как Gemstone, намного проще обеспечить соблюдение сложных правил действительности.
Возможности специальных запросов OODBMS намного лучше, чем у СУБД на основе SQL.
Также: * Встроенные сценарии - там, где обычно требуется использовать что-то меньшее, чем полноценная СУБД. Db4o - это ODB, который можно легко использовать в таком случае. * Быстрая разработка или разработка на основе проверки концепции - когда вы хотите сосредоточиться на бизнесе и не беспокоиться о постоянном уровне
Если вам не нужен КИСЛОТА, вам, вероятно, не нужны накладные расходы на СУБД. Итак, сначала определите, нужно ли вам это. В большинстве представленных здесь ответов, не относящихся к СУБД, нет предоставляет ACID.
Вы можете привести пример, почему / когда не нужна ACID?
@vibneiro, если в базе данных есть только один пользователь, который выполняет только последовательные операции, или риск несогласованности базы данных в случае сбоя питания приемлем, или концепция транзакций базы данных не применяется, или нет необходимости в ограничениях, каскадов, триггеров и т.п., тогда может быть достаточно не-КИСЛОТА не-RDBMS-провайдера (например, текстовый файл с API-интерфейсом, подобным RDBMS). Например, ваше приложение может хранить базу данных исторических диагностических сообщений, для которых ACID совершенно неактуален и будет достаточно "log.txt".
Оказывается, в очень редких случаях КИСЛОТА не нужна. Интересно, почему тогда базы данных NoSQL так популярны? Большинство из них не поддерживают полную КИСЛОТНОСТЬ.
@vibneiro, NoSQL обычно проще, легче, легче встраивается, удобнее размещать самостоятельно, более интуитивно понятно, более гибко и обычно с немного ACID. Если у вас нет реляционных данных, возможно, вам не нужна СУБД.
K.I.S.S: будь маленьким и простым
Это вежливая версия ... Я чаще слышал: «Будь простым, глупым» ... или, глоток, может быть, это именно то, что мне говорят люди! :-(
Я настоятельно рекомендую Lua в качестве альтернативы хранилищу данных типа SQLite.
Потому что:
Это вариант принятого ответа "сборник на родном языке". Если вы используете C / C++ в качестве уровня приложения, вполне разумно добавить движок Lua (100 КБ двоичного кода) только для чтения конфигураций / данных или их записи.
Lua - это язык программирования. Это предложение можно обобщить, чтобы предложить любые функции сохранения / сериализации любого языка программирования (например, pickle / shelve в Python или JSON / YAML для Perl и др. И т. Д.). Это вообще не касается одновременного доступа и гарантий ACID.
Ты прав. Чего не хватало в моей записи, так это подразумеваемого характера такого использования только для чтения. В таком сценарии я придерживаюсь своего текста. Для чтения-записи использование Lua таким образом не имеет абсолютно никакого смысла. Многие вещи, s.a. Метаданные файловой системы в основном доступны только для чтения, поэтому такой подход не означает полного требования ro.
CAP теорема лаконично объясняет. SQL в основном обеспечивает «сильную согласованность: все клиенты видят одно и то же представление, даже при наличии обновлений».
Я бы предложил РСУБД :) Если у вас нет проблем с настройкой / администрированием, выберите SQLite. Встроенная СУБД с полной поддержкой SQL. Он даже позволяет хранить данные любого типа в любом столбце.
Основное преимущество перед, например, файлом журнала: если у вас большой, как вы собираетесь искать в нем? С механизмом SQL вы просто создаете индекс и значительно ускоряете работу.
О полнотекстовом поиске: SQLite также имеет модули для полнотекстового поиска.
Просто наслаждайтесь приятным стандартным интерфейсом для ваших данных :)
Почему данные базовой станции не подходят для реляционной модели?