2012-03-22 5 views
1

Я новичок в разработке баз данных и просто хотел несколько мнений относительно того, собираюсь ли я сделать это логически. Я создаю простую базу данных MySQL, через которую пользователи будут загружать элементы в ранее существующее (неизменяемое) иерархическое дерево.Рекомендации по созданию иерархической базы данных 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 подразделений в каждом подразделении. Это имеет смысл в качестве стартовой стратегии?

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

Любые рекомендации или ссылки на литературу/учебники были бы оценены!

+1

Если у вас никогда не будет более 3 уровней, вы можете пойти «дешево» и просто иметь '(section_id, div_id, subdiv_id)' и хранить все это в одной таблице. он был бы уязвим для ошибок иерархии, таких как 'seC# 1, div 2.1, subsec 1.1.1'. –

+0

Я согласен с Marc B, что ваша структура технически иерархична, но ее структура недостаточно динамична, чтобы гарантировать передовую структуру данных. вы могли бы избежать ошибок категорий с помощью простых ограничений. –

+0

Большое спасибо Марку и Дэвиду! Дэвид, не могли бы вы расширить то, что вы подразумеваете под простыми ограничениями? Marc B, если все продукты должны быть отнесены к подразделу (например, «Apple Apple Macintosh Apple Orchard», подаваемому под AmericanFruit> Apples> Macintosh), я сразу же говорю, что у меня будет одна таблица, которая описывает неизменное дерево, и затем вторую таблицу, которая содержит определенную информацию и идентификатор для «Apple Macintosh Apple Apple Orchard» и ссылку на его родительский subdiv_id? Я надеюсь, что это ясно :) – TheNally

ответ

2

Потому что "структура дерева не изменится", вам нужно 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 
); 

Для других requerimets, например:

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

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

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 
); 
+0

Спасибо большое за это! Это именно то, что я пытался выразить. Я начал этот процесс, но не был уверен, считался ли он приемлемым решением. – TheNally

2

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

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

Я думаю, что это называется вложенными наборами: http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ – Nathan

+0

GrandmasterB и другие, спасибо за ввод. Я на самом деле ранее вытягивал схему во вложенной диаграмме набора (потребовалось долгое время, с примерно 400 возможными подразделениями). Мои вопросы начинаются со второй таблицы, которую вы описали. Элементы ДОЛЖНЫ быть классифицированы под подразделением, поэтому вся введенная информация всегда будет на том же уровне. Как будет выглядеть фрагмент кода для ввода fileC в раздел 2, раздел 2, подраздел 1 (из вашего примера)? Также (снято в темноте) есть ли простой способ назначить низкие/высокие числа большому количеству узлов дерева? – TheNally

+0

Вы можете преобразовать рекурсивную таблицу во вложенный набор. Проверьте это сообщение: http://sqlblog.com/blogs/adam_machanic/archive/2006/07/12/swinging-from-tree-to-tree-using-ctes-part-1-adjacency-to-nested-sets. aspx Также это: http://jsimonbi.wordpress.com/2011/02/14/nested-set-hierarchy/ – Nathan

2

Хорошее решение должно иметь рекурсивный стол.

Проверить этот пост на StackOverflow: Hierarchical Data in MySQL

Таким образом, ваша конструкция будет поддерживать имеющие несколько уровней вниз по дереву.

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

Managing Hierarchical Data in MySQL

Hierarchical data in MySQL: parents and children in one query

Hierarchical data in MySQL: easy and fast

Recursion-less storage of hierarchical data in a relational database

+0

спасибо за ссылки, некоторые из них я проверил, но я обязательно буду искать в рекурсивных таблицах. Еще раз спасибо! – TheNally