Как хранить фрагменты URL в базе данных? - PullRequest
1 голос
/ 24 февраля 2011

Как URL-адреса (фрагменты) хранятся в реляционной базе данных?

В следующем фрагменте URL-адреса:

 ~/house/room/table

перечислены все данные в таблице и, возможно, некоторая информация отаблица.

Этот фрагмент:

~/house

выводит: Street 13 и Room, Garage, Garden

~/house/room

, выводит: My room и Chair, Table, Window

Как выглядит схема базы данных?Что если я переименую house в flat?

Возможное решение

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

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

SELECT FROM items WHERE key=house AND level=1 AND key=room AND level=2

Как мне решить эту проблему, если URL может быть сколь угодно глубоким?

1 Ответ

2 голосов
/ 24 февраля 2011

check Модель списка смежности и Модель вложенного набора , описанная в Деревья и иерархии Джо Селко в SQL для умных людей

Вам следуетнайти много информации на эту тему.одна статья здесь

Обновление

Модель вложенного набора очень хороша, если вы ищете такую ​​задачу, как 'Получение одного пути' .Что у вас есть 'Найдите ближайших подчиненных узла' .Здесь Модель списка смежности лучше.

| id | p_id | name  |
|  1 | null | root  |
|  2 |    1 | nd1.1 |
|  3 |    2 | nd1.2 |
|  4 |    1 | nd2.1 |

SQL для получения строки с именем фрагмента и его прямыми подпунктами.

SELECT
  p.name,
  GROUP_CONCAT(
    c.name
    SEPARATOR '/'
  ) AS subList
FROM _table p
INNER JOIN _table c
  ON p.id = c.p_id
WHERE p.name = 'root'

PS предпочитаетеWHERE p.id = 1.Идентификатор уникален, поскольку имя может быть неоднозначным.

Подробнее о синтаксисе см. В функции MySQL GROUP CONCAT .

...