Советы по иерархическому проектированию баз данных MySQL - PullRequest
1 голос
/ 22 марта 2012

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

Для простого примера:

Раздел 1

Дивизион 1.1Подраздел 1.1.1Подраздел 1.1.2

Подраздел 1.2Подраздел 1.2.1Подраздел 1.2.2

Раздел 2

Подраздел 2.1Подраздел 2.1.1Подраздел 2.1.2

Подраздел 2.2Подраздел 2.2.1Подраздел 2.2.2

Структура дерева не изменится, пользователи просто загрузят продукты, которые попадут в подразделы (отраслевой способ организации большого количества продуктов).Я провел исследование списков смежности и вложенных множеств, но склоняюсь к 3 отдельным таблицам, каждая из которых ссылается на первичный ключ своего родителя (видя, что верхние уровни дерева практически никогда не изменятся).Когда новый продукт загружен, он будет ссылаться на всех трех своих родителей (если он зарегистрирован в подразделе 1.1.2, он обязательно является частью раздела 1, раздел 1).Финальное дерево будет иметь 4 раздела, по 10 разделов в каждом разделе и 10 подразделений в каждом разделе.Имеет ли это смысл в качестве стартовой стратегии?

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

Будем благодарны за любые рекомендации или ссылки на литературу / руководства!

Ответы [ 4 ]

2 голосов
/ 23 марта 2012

Хорошим решением было бы иметь рекурсивную таблицу.

Проверьте этот пост в StackOverflow: Иерархические данные в MySQL

Таким образом, ваш дизайн будет поддерживать болееУровни вниз по дереву.

Другие интересные статьи на эту тему:

Управление иерархическими данными в MySQL

Иерархические данные в MySQL: родителии потомки в одном запросе

Иерархические данные в MySQL: легко и быстро

Безрекурсивное хранение иерархических данных в реляционной базе данных

2 голосов
/ 23 марта 2012

Поскольку «структура дерева не изменится», вам нужны таблицы section, division и subdivision (также продукты).

create table section (
  id int primary key,
  name varchar(100) 
);

create table division (
  id int primary key,
  name varchar(100) ,
  section_id int references section
);

create table subdivision (
  id int primary key,
  name varchar(100) ,
  division_id int references division
);

create table product (
  id int primary key,
  name varchar(100) ,
  subdivision_id int references subdivision
);

Для других реквизитов, например:

  • Неизвестное дерево глубины.
  • Назначение продуктов нескольким уровням дерева.

Вы будете искать решение родитель-ребенок, например:

create table tree (
  id int primary key,
  parent_id int null references tree,
  name varchar(100) 
);

create table product (
  id int primary key,
  name varchar(100) ,
  subdivision_id int references tree
);
2 голосов
/ 23 марта 2012

Поскольку категории (разделы) более или менее статичны, вы можете назначить каждой категории «высокое» и «низкое» число, например

catid  name        low      high
1      Section1     1       20
2      Div1.1       2       10
3      Div1.2       11      19
4      Section2     21      40
5      Div2.1       22      29
6      Div2.2       30      39

Тогда есть отдельная таблица для содержания:

id   catid   content
1    2       fileA 
2    2       fileB
3    5       fileC

Чтобы затем запросить ВСЕ элементы в разделе 1, вы просто запрашиваете все элементы в категории, которые имеют максимум и минимум между 1 и 20. Чтобы получить все элементы в Div2.1 (и ниже), вы запрашиваете все элементы у которых есть категории с высокими и низкими значениями от 22 до 29. Это позволяет очень легко отслеживать количество элементов в подкатегориях.

Я забыл название этого фактического подхода (если есть окончательный), но я использовал его несколько раз. Для структур, которые не сильно меняются, работать с ними намного проще, чем с традиционной структурой типа parent_id-child_id.

0 голосов
/ 25 сентября 2013

Посмотрите на вложенные множества и вложенные интервалы:

...