Документы NoSQL для реляционных данных (местоположения) - PullRequest
1 голос
/ 12 апреля 2011

У меня есть список мест, которые в настоящее время в MySQL имеют иерархию над ним, как, например, Континент> Страна> Область / Регион / Штат> Прованс> Местоположение.Если бы я должен был хранить эти места в магазине NoSQL (например, CouchDB).Буду ли я хранить континент как объект верхнего уровня, а остальные как дочерние массивы объектов для этого континента.Затем используйте карту / уменьшить, чтобы создать различные виды для стран, округов и т. Д. Является ли это рекомендуемой структурой для такого рода данных?Это сделало бы документ каждого континента очень большим?

{
  name: "Europe",
  type: "CONTINENT",
  countries: [
     { 
       name: "England" 
       counties: [...]
     }
  ]
}

1 Ответ

4 голосов
/ 12 апреля 2011

Это всего лишь предположение и предположение с моей стороны, но я думаю, что у меня есть хорошая идея. (Я бы также настоятельно рекомендовал просмотреть данные * * по типу местоположения GeoCouch .)

Если вы хотите продолжить самостоятельно, вы можете сохранить каждое местоположение со всеми уровнями детализации, сохраненными в виде атрибутов:

{
    "continent": "North America",
    "country": "United States",
    "state": "Texas",
    "city": "Houston"
}

Я из США, поэтому я использую то, что обычно использую для определения своего местоположения. (Я заметил, что вы использовали Прованс, округ и т. Д., Которые можно легко включить в эту модель)

В любом случае, функция просмотра будет выглядеть так:

function (doc) {
    emit([doc.continent, doc.country, doc.state, doc.city], null);
}

Это представление выведет:

{
    "key": ["North America", "United States", "Texas", "Houston"],
    "value": null
}

Теперь я знаю, что это избыточные данные, поскольку они хранятся таким образом для каждого места. Это нормально, мы имеем дело с NoSQL, нет необходимости продолжать мыслить реляционно. (именно поэтому вы смотрите на другое решение, такое как CouchDB)

В любом случае, вы можете использовать параметр просмотра group_level, чтобы "развернуть" ваши местоположения. Использование group_level=1 даст вам результат просмотра, сгруппированный по континенту. group_level=2 будет группироваться по стране, group_level=3 будет группироваться по штатам и т. Д.

Использование функции уменьшения позволяет получить счетчики и другую статистику для каждой из этих группировок. Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...