Статьи

Иллюстрированное руководство по размещению и получению данных из базы данных

Базы данных поддерживают установку и получение данных. Что отличает один тип базы данных от другого, так это структура данных, которые они хранят, и средства, с помощью которых эти данные извлекаются. Существует множество типов баз данных . Тем не менее, этот короткий пост будет обсуждать только несколько.

Примитивное хранилище : можно представить самую простую базу данных, которая содержит только простые значения данных. Давайте назовем такую ​​базу данных «примитивным магазином». С примитивным хранилищем нет структуры данных. Каждый элемент данных является примитивным значением в одном неупорядоченном наборе (то есть сумке примитивов). Примитивы могут быть вставлены в набор и позже восстановлены.

// 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 г.