Базы данных поддерживают установку и получение данных. Что отличает один тип базы данных от другого, так это структура данных, которые они хранят, и средства, с помощью которых эти данные извлекаются. Существует множество типов баз данных . Тем не менее, этот короткий пост будет обсуждать только несколько.
Примитивное хранилище : можно представить самую простую базу данных, которая содержит только простые значения данных. Давайте назовем такую базу данных «примитивным магазином». С примитивным хранилищем нет структуры данных. Каждый элемент данных является примитивным значением в одном неупорядоченном наборе (то есть сумке примитивов). Примитивы могут быть вставлены в набор и позже восстановлены.
// put data db.put('marko'); db.put(31); db.put(true); // get data Iterator results = db.get(); Iterator filteredResults = db.get{it.startsWith('ma')};
Хранилище ключей / значений : Для систем хранения на основе ключей / значений структура данных представляет собой упорядоченный 2-кортеж, который содержит ключ и значение. Другие имена для этой структуры данных включают ассоциативный массив, карту или словарь. При взаимодействии с хранилищем ключ / значение пары данных вставляются в базу данных, а значения извлекаются на основе их ключей.
// put data db.put('name', 'marko'); db.put('age', 31); // get data Object value = db.get('name');
Хранилище документов . Следующим уровнем структурной сложности является хранилище документов . Документы представляют собой древовидные / вложенные структуры, такие как предоставляемые XML и JSON . Этот дополнительный уровень сложности обеспечивает большую гибкость моделирования для разработчика. Например, можно смоделировать человека как документ следующим образом:
Document document = { type : "person", name : "marko", age : 31, skills : { languages : { ["java", "groovy", "gremlin", "R"] } } }
Чтобы найти специалиста в R , создается «объект запроса». Подобно классическим системам кортежей , объект запроса обеспечивает необходимые привязки. Для всех полей, не указанных, используется подстановочный знак.
// put data db.put(document); // get data Document result = db.findOne({ type : "person", skills.languages : "R" });
Наконец, большинство хранилищ ключей / значений и документов поддерживают шаблон MapReduce . С MapReduce каждый документ (или ключ / значение) обрабатывается параллельно, а результат каждого процесса агрегируется и возвращается пользователю. Например, функция map () и redu () может быть написана для определения распределения языков людей в базе данных.
База данных графа : Структура данных базы данных графа представляет собой произвольно связанный компонент, известный как граф (например, последовательности, деревья, решетки, циклы и т. Д.). В некотором смысле, графическая база данных похожа на базу данных документов, за исключением того, что определенные поля в документе могут напрямую ссылаться на другие документы. В графовом жаргоне объекты известны как вершины, а отношения между вершинами известны как ребра.
Vertex v = db.putVertex({'name' : 'marko', 'age' : 31}); Vertex u = db.putVertex({'language' : 'gremlin'}); db.putEdge(v, 'hasSkill', u);
Существует два способа получения данных из базы данных графа: сопоставление с образцом и обход . Запрос на сопоставление с шаблоном во многом похож на запрос документов в хранилище документов. Шаблон графа определяется, когда конкретные компоненты являются переменными (то есть подстановочными знаками). Классическим языком для сопоставления с образцом на основе графа является SPARQL .
SELECT ?x ?y WHERE { ?x knows marko . marko hasSkill ?y . ?x hasSkill ?y }
В приведенном выше запросе переменные ? X и ? Y связывают людей и навыки соответственно. Тем не менее, правило графического шаблона говорит, что привязка происходит только для тех людей, которые знают Марко и делятся с ним навыком.
Вторая модель запроса — это обход графика. При обходе графа можно коснуться (и зациклить) произвольного числа вершин / ребер, чтобы получить конечные точки (места обхода), пути (история обхода) или результирующие вычисления (побочный эффект обхода). На языке обхода графа Gremlin , возраст людей, которые делятся навыками с Марко, можно определить с помощью следующего запроса ( назначение обхода ):
marko.out('hasSkill').in('hasSkill').except([marko]).age
Чтобы определить все нецикличные пути дружбы между Марко и Джошем, можно оценить следующее ( история обхода ):
marko.out('friend').uniquePath.loop(2){it.object != josh}.paths
Наконец, чтобы определить центральность каждой вершины в графе, можно использовать обход следующей формы, где m — карта, в которой хранится итоговая оценка центральности для каждой вершины ( побочный эффект обхода ).
m = [:] g.V.out.groupCount(m).loop(2){it.loops < 100}
Существует множество типов баз данных. Каждый предоставляет средства для хранения и извлечения структурированных данных. В зависимости от сложности моделируемого домена и требуемых типов вычислений существует база данных для удовлетворения потребностей каждого проекта.
Рекомендации
Родригес, М. А., « Обзор парадигм управления данными: реляционные, документы и графики », семинар по управлению данными, Университет Нью-Мексико, февраль 2010 г.
Уэббер Дж. « Квадратные колышки и круглые отверстия в мире NOSQL », World Wide Webber, апрель 2011 г.
Родригес М.А., Нойбауэр П. « Конструкции из точек и линий », Бюллетень Американского общества информатики и техники, 36 (6), с. 35–41, doi: 10.1002 / bult.2010.1720360610, август 2010 г.
Rahien, A. « Что не так, SQL — хранилище ключей / значений» , «Неестественные законы в отношении исходного кода», март 2010 г.