Nano Hash - криптовалюты, майнинг, программирование

Проектировать реляционную базу данных — использовать иерархические модели данных или избегать их?

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

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

Кстати, я использую PostgreSQL.

Извините за мой плохой английский.

С уважением,


  • См. этот вопрос для списка параметров, дальнейшего чтения и примечаний о стоимости действий, таких как поиск предка и время вставки узла: stackoverflow.com/questions/4048151/ 07.02.2011

Ответы:


1

У вас есть несколько вариантов хранения иерархий:

  • Список смежности
  • Рекурсивный запрос в списке смежности
  • Перечисление пути
  • Вложенные наборы
  • Таблица закрытия

Если у вас PostgreSQL версии 8.4 или выше, вы можете использовать рекурсивные запросы сделать все очень просто. Это, безусловно, самое простое решение, которое легко запрашивать, легко вставлять новые записи, легко обновлять текущие записи, легко удалять записи, и у вас есть ссылочная целостность. Во всех других решениях есть части, которые трудно решить.

Список смежности:

CREATE TABLE categories ( 
  id SERIAL PRIMARY KEY, 
  parent_id BIGINT, 
  category TEXT NOT NULL, 
  FOREIGN KEY (parent_id) REFERENCES categories(id) 
);

INSERT INTO categories(parent_id, category) VALUES(NULL, 'vehicles');
INSERT INTO categories(parent_id, category) VALUES(1, 'cars');
INSERT INTO categories(parent_id, category) VALUES(1, 'motorcycles');
INSERT INTO categories(parent_id, category) VALUES(2, 'SUV');
INSERT INTO categories(parent_id, category) VALUES(2, 'sport');
INSERT INTO categories(parent_id, category) VALUES(3, 'cruising'); 
INSERT INTO categories(parent_id, category) VALUES(3, 'sport'); 


WITH RECURSIVE tree (id, parent_id, category, category_tree, depth) 
AS ( 
    SELECT 
        id,
        parent_id,
        category,
        category AS category_tree,
        0 AS depth 
    FROM categories 
    WHERE parent_id IS NULL 
UNION ALL 
    SELECT 
        c.id,
        c.parent_id,
        c.category,
        tree.category_tree || '/' || c.category AS category_tree,
        depth+1 AS depth 
    FROM tree 
        JOIN categories c ON (tree.id = c.parent_id) 
) 
SELECT * FROM tree ORDER BY category_tree;

Результат:

'1','','автомобиль','автомобиль','0'

'2', '1', 'автомобили', 'автомобиль/автомобили', '1'

'4', '2', 'внедорожник', 'автомобиль/автомобили/внедорожник', '2'

'5', '2', 'спорт', 'автомобиль/автомобили/спорт', '2'

'3', '1', 'мотоциклы', 'автомобиль/мотоциклы', '1'

«6», «3», «круизный», «автомобиль/мотоциклы/круизный», «2».

'7', '3', 'спорт', 'автомобиль/мотоциклы/спорт', '2'

05.02.2011
  • +1 за указание на рекурсивные запросы (которые в настоящее время поддерживаются широким спектром СУБД) 05.02.2011
  • Очень хороший пример того, как получить иерархию и глубину строк. Затем глубину можно использовать для топологической сортировки (ORDER BY depth). 06.08.2012

  • 2

    Если вы используете Postgres, вы можете сохранить иерархию в массиве в виде материализованного пути.

    Вы также получаете выгоду от индексации GIN с этим подходом, который в моих экспериментах показал лучшую производительность, чем рекурсивный запрос.

    15.05.2013
  • как бы вы создали индекс GIN для такого столбца? 07.07.2016
  • Так же, как вы создали бы любой старый индекс: CREATE INDEX name ON table USING gin(column); (postgresql.org/ docs/9.5/static/textsearch-indexes.html) 22.07.2016

  • 3

    Что вы подразумеваете под «иерархической моделью данных»? Если вы просто имеете в виду моделирование иерархии в реляционной базе данных или базе данных SQL, то это совершенно обычная и разумная вещь. Существует значительное количество литературы по базам данных о том, как реляционно моделировать иерархии. В этом нет ничего «нереляционного».

    Однако термин Иерархическая модель данных чаще относится к типу СУБД (а не к РСУБД или СУБД SQL). Иерархические/сетевые/графовые СУБД работают на других принципах, чем РСУБД – они используют навигационные модели или модели на основе указателей, а не реляционную модель. Реляционная модель/модель SQL в значительной степени (но не полностью) заменила этот тип СУБД. Если вы не используете СУБД иерархического типа, вам не о чем беспокоиться.

    05.02.2011
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..