2010-05-06 2 views
4

Учитывая В следующей таблицеПолучение данных с иерархической структурой в MySQL

id parentID name  image 
0  0     default.jpg 
1  0   Jason 
2  1   Beth  b.jpg 
3  0   Layla  l.jpg 
4  2   Hal  
5  4   Ben  

Я хочу сделать следующее:

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

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

Cheers!

ответ

12

В MySQL нет рекурсивных запросов, которые являются частью стандартного SQL. Многие другие базы данных поддерживают эту функцию, включая PostgreSQL (см. http://www.postgresql.org/docs/8.4/static/queries-with.html).

Существует несколько методов обработки иерархических данных в MySQL.

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

Есть также несколько умных методов, чтобы хранить иерархические данные, так что вы можете запросить их:

  • Path Перечень хранит список предков с каждым узлом. Например, фото 5 в вашем примере будет хранить «0-2-4-5». Вы можете искать предков, ища узлы, чей путь, конкатенированный с «%», является совпадением для пути 5 с предикатом LIKE.

  • Вложенные наборы является сложным, но умный метод популяризировал Джо Селко в своих статьях и книге «Деревья и иерархический SQL для Smarties.» Существует множество онлайн-блогов и статей об этом. Легко запрашивать деревья, но трудно запросить непосредственных детей или родителей и трудно вставлять или удалять узлы.

  • Таблица закрытия включает в себя сохранение отношений между предками и потомками в отдельной таблице. Легко запрашивать деревья, легко вставлять и удалять, и легко запрашивать непосредственных родителей или детей, если вы добавите столбец pathlength.

Вы можете увидеть больше информации, сравнивая эти методы в своей презентации Practical Object-Oriented Models in SQL или моей будущей книги SQL Antipatterns: Avoiding the Pitfalls of Database Programming.

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

  • Нет связанных вопросов^_^