Язык
Контакты
GitHub
Поддержка
Регистрация
Войти
Логин: Пароль: Запомнить:
Пользователи
Последние сообщения
Ответить
1

Иерархическое ID в базе

Ater

  • Атом-мозг
  • Юзер
  • 750
  • Репутация:15 
  • Предупреждения: 0 
  • Регистрация:
    17 Авг 2010
#1
Мне тут мелкософтовские SQLщики предложиле ввести иерархическое ID для всего что имеет вложения друг в друга.

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

принцип прост.
Допустим у нас есть такая структура категорий:
Первый уровень
Второй уровень
Третий уровень
Первый уровень
Второй уровень

Соответственно у каждой из этих категорий есть некий ID и parent_id

ID формируются как и обычно

1 Первый уровень
2 Второй уровень
3 Третий уровень
4 Первый уровень
5 Второй уровень

а вот paren_id лучше всего уже формировать иерархическим:

1 Первый уровень 0
2 Второй уровень 1
3 Третий уровень 1.2
4 Первый уровень 0
5 Второй уровень 4

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

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

Да, кстати условие для выборки сказали будет где то вот такое where hnum like '1.%' , но это в мелкосовтовском.

Таким же образом формируем ссылку из таблицы материала:
если материал входит в первый уровень категории то category_id == ID категории
если во второй и глубже то category_id == parent_id + ID (например для третьего уровня будет выглядеть как 1.2.3)

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


я правда не очень знаю можно ли такое реализовать в MySQL или нет.
Кто что может сказать по этому аповоду?

p.s. если не в той ветке форума то сори...

Все мое имхо...
------
Не флуди и не да зафлудим будешь!

Drunya

  • Man of God
  • Админ
  • 3527
  • Репутация:110 
  • Предупреждения: 0 
  • Регистрация:
    30 Ноя -0001
#2
ну вообще идея как бы нормальная. Правда я хз как это с точки зрения нормализации БД. Например, в самих категориях, еще понятно зачем это. Но в материале это точно лишнее, так как при запросе материала, мы все равно получаем сразу и информацию о его категории. То есть это как бы дублирование будет левое.

Хотелось бы конечно увидеть результаты каких то тестов такого подхода. С точки зрения удобства, он хорош. Но вот производительность пострадает я думаю. Это если и делать, то не parent_id, а завести отдельное поле с перечнем родительских категорий. Ну и юзать их, при необходимости. Так как id должно быть id. Это как бы правила хорошего тона)

Я горжусь тем, что создал бесплатную CMS - AtomX. И люблю нашу команду)

Ater

  • Атом-мозг
  • Юзер
  • 750
  • Репутация:15 
  • Предупреждения: 0 
  • Регистрация:
    17 Авг 2010
#3
как раз в материалах это то что надо.
сейчас ты думаешь как выводить в материнских категориях материал всех дочерних категорий, а там ты будешь искать просто ID матери.
точно так же с подсчетом материалов в каждой категории.

с тестами как раз плохо обстоит дело... сейчас времени ну совсем мало =(

Drunya пишет:
Так как id должно быть id
так, я ID нигде не трогал, я трогаю только ссылки. parent_id это уже не id, а ссылка на мать. Ничего страшного не будет если эта ссылка будет иерархической.
Точно так же в материалах я не трогал их ID, а трогал только ссылку на категорию в которую добавлен материал. И опять же не вижу ничего страшного если ссылка будет полной и иерархической.

Все мое имхо...
------
Не флуди и не да зафлудим будешь!

skad0

  • Атом-мозг
  • Юзер
  • 841
  • Репутация:10 
  • Предупреждения: 0 
  • Регистрация:
    2 Окт 2010
#4
а зачем? Лишние действия только. Разбиваться все это на массивы и все такое. Намного проще делать столбец и в таблице и все.

Ater

  • Атом-мозг
  • Юзер
  • 750
  • Репутация:15 
  • Предупреждения: 0 
  • Регистрация:
    17 Авг 2010
#5
skad0 пишет:
Намного проще делать столбец и в таблице и все.
наверно я жутко туплю, но что то я не догоняю ничего...

Все мое имхо...
------
Не флуди и не да зафлудим будешь!
1
Сейчас online: 128. Зарегистрированных: 0. Гостей: 128.