2016-10-14 3 views
0

В основном я сосредоточен на операции запроса, а не на объединении или пересечении.
Вот пример.Есть ли база данных, которая может представлять собой подобную структуру?

Пусть говорят, что мы имеем категорию многоуровневую:

  • КАТЕГОРИЯ TOP-LEVEL:

    • category1:

      • CATEGORY1.1:
        • item1
    • category2:

      • CATEGORY2.1:
        • элемент2

Здесь пункт [N] - это данные. Категория - это древовидная структура, представляющая категорию, к которой принадлежит элемент.

Теперь предположим, что я хотел бы запросить все данные в категории 1, база данных должна дать мне item1.

Предположим, что я хочу запросить все данные в категории верхнего уровня, база данных должна дать мне item1 и item2.

Это как теория множеств. Поскольку item1 принадлежит CATEGORY1.1, а CATEGORY1.1 принадлежит CATEGORY1. Таким образом, item1 принадлежит CATEGORY1.

Одно из решений - использование материализованных путей: мы помещаем поле в элемент с именем path, значение равно: «, CATEGORY-TOP-LEVEL, CATEGORY1, CATEGORY1.2». Но проблема в том, что это вызовет много операций записи, когда я изменю имя категории или иерархию категории.

Может ли MongoDB поддерживать это? если нет, может ли база данных поддержать это?

P.S. Давайте рассмотрим эффективность выполнения запросов.

+0

Как часто вы собираетесь менять промежуточные категории? –

+0

Является ли количество уровней (3 категории в вашем примере) фиксированным или переменным? –

+1

Установить как? Вся реляционная модель основана на наборе. Это вопрос с подвохом? – duffymo

ответ

0

Каждая база данных modern relational может поддерживать это.

Существуют различные способы моделирования этого в реляционной базе данных, наиболее распространенным из них называется «модель смежности»:

create table category 
(
    id     integer primary key, 
    name    varchar(100) not null, 
    parent_category_id integer references category 
); 

Если элемент может только когда-либо принадлежать к одной категории, таблица пункт будет выглядеть следующим образом:

create table item 
(
    id   integer primary key, 
    name  varchar(100) not null, 
    category_id integer not null rerences category 
); 

Если элемент может принадлежать более чем к одной категории, вам нужно много-ко-многим (также очень распространены в реляционную мире)

Чтобы получить все категории ниже определенной категории можно использовать рекурсивный запрос:

with recursive cat_tree as (
    select id, name, parent_category_id 
    from category 
    where id = 42 -- this is the category where you want to start 
    union all 
    select c.id, c.name, c.parent_category_id 
    from category c 
    join cat_tree p on p.id = c.parent_category_id 
) 
select * 
from cat_tree; 

Чтобы получить детали вместе с категориями, просто присоединиться к выше к item таблице.

Этот запрос является стандартным ANSI SQL.

Другие популярные модели представляют собой модель вложенного набора, материализованный путь (вы упомянули об этом) и таблицу закрытия.

Этому задают много вопросов. См. Теги и для многих других примеров.

+0

спасибо за ответ. Это решение. Но я беспокоюсь о производительности. Особенно, когда мне нужно сортировать и разбивать на страницы. Есть ли проблема с производительностью? – kilik52

+0

Это, очевидно, сильно зависит от СУБД, которую вы будете использовать, и от того, сколько категорий у вас будет (и многих других факторов). Я использовал этот подход без проблем со 100 000 категориями. –

Смежные вопросы