Как хранить иерархическую информацию в базе данных? - PullRequest
2 голосов
/ 19 мая 2011

У меня есть следующая информация, которую следует получить с помощью нескольких зависимых полей выбора в веб-форме:

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

Food
 - Fruits
   - Tropical
      - Pineapples
          - Pineapples - Brazil
          - Pineapples - Hawaii
      - Coconuts
   - Continental
      - Orange
 - Fish

....

Эти данные должны поступать из базы данных.

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

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

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

Ответы [ 3 ]

2 голосов
/ 19 мая 2011

Один вопрос, который не был задан вашим вопросом, заключается в том, имеют ли все фрукты одинаковые свойства или нет.

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

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

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

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

2 голосов
/ 19 мая 2011

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

  • Список смежности
  • Вложенные множества
1 голос
/ 19 мая 2011

Каву дал вам ответ .... рекурсивное отношение (таблица будет связана с самим собой), также известное как Свинья Ухо отношение.

В вашем примере показан родитель с несколькими детьми, но вы не сказали, может ли элемент принадлежать более чем одному родителю.Может ли апельсин быть в «Тропическом» и в «Цитрусовом»?

В каждой строке есть id и parent_id, где parent_id указывает на id другой строки.

id=1 name='Fruits' parent_id=0
id=2 name='Citrus' parent_id=1
id=3 name='Bitter Lemon' parent_id=2
id=4 name='Pink Grapefruit' parent_id=2

Вот несколько примеров схем, использующих этот тип отношений для предоставления неограниченных родительско-дочерних отношений:

...