ФорумРазработкаБазы данных → Как правильно реализовать _неоднородную_ древовидную структуру?

Как правильно реализовать _неоднородную_ древовидную структуру?

  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 22 марта 2011 г. 16:56

    Значит такая тема:
    1) страны
    2) в некоторых странах есть федеральный округ (Россия: Уральский, Центральный, Южный) - родитель страна
    3) в некоторых странах/федеральных округах есть области - родитель или страна или фед. округ
    4) города - родитель или страна или область или фед. округ
    5) в некоторых городах есть административный округ (Москва: ЮАО, ВАО) - родитель город
    6) районы - родитель или город или административный округ


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


    Короче имеем древо. Относительно невысокой вложенности, почти конечной. Но это дерево очень разнородно. Сейчас это сделано довольно жж0стко, через несколько таблиц. Как бы это дело организовать?

    Есть мысли сделать все в 1 таблице - довольно легко будет реорганизовывать элементы, если я вдруг захочу добавить области в мою славную страну (сейчас там тупо города). Но в то же время мне нужно знать, к чему это я прикреплен - к городу или области. И как мы видим - на глубину иерархии рассчитывать нельзя, так как она может быть разная.
    Спустя 156 сек.
    мне кажется, что сюда неплохо подошел бы http://martinfowler.com/eaaCatalog/singleTableInheritance.html , тем более его поддержка есть в доктрине2. А вы как думаете?
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 22 марта 2011 г. 20:19, спустя 3 часа 23 минуты

    выбираем что у нас является целью. скорее всего это населенный пункт (типа город). (район города это уже похуй, ящитаю -0 всё, что ниже по иерархии – это доп. необязательные атрибуты)
    города храним в в своей таблице, это обычный плоский список. уникально адресуем по id, и неуникально индексируем по названию. нам же понадобится быстрый угадывающий ввод, верно?

    всё, что выше по иерархии представляем в виде дерева. например nested sets. у города ставим ссылки на верхний узел - "страна" и нижний узел - "область" либо "район". в некоторых случаях вся иерархия это страна ))) верхний == нижний

    Пярну: Литва, Литва
    Париж: Франция, Франция
    Париж: Варненский район (Челябинская область), Россия
    ιιlllιlllι унц-унц
  • Faster

    Сообщения: 1159 Репутация: N Группа: Кто попало

    Spritz 22 марта 2011 г. 22:05, спустя 1 час 46 минут 21 секунду

    New-York: Нью-Йоркская Губерния, Россия
  • TRIAL

    Сообщения: 988 Репутация: N Группа: Джедаи

    Spritz 23 марта 2011 г. 10:54, спустя 12 часов 48 минут 24 секунды

    Мне щас нужно сделать то же самое :) Правда над тем как это будет храниться мне пока дела нет. Не подскажете где мне взять список всех стран => городов? Возможно есть готовые скрипты.
    А что касается структуры, наверное сделал бы просто привязку по id. То же самое древо в одной таблице, бесконечная вложенность. Не знаю как на счет простоты и скорости запроса, но вроде вложенность большой не будет Страна - Город - Район, даже если улица - дом добавить вроде всё равно всё просто, быстро и понятно будет.
    from TRIAL with LOVE
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 23 марта 2011 г. 13:12, спустя 2 часа 18 минут 2 секунды

    Пярну

    вроде это Эстония)

    что у нас является целью. скорее всего это населенный пункт (типа город)

    Когда выводим пользователей или места встреч - нужно указывать и район, и АО (если есть), и город.

    нам же понадобится быстрый угадывающий ввод, верно?

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

    например nested sets

    да необязательно, у нас не шибко высокая вложенность, можно будет просто 3-4 джоина делать.

  • TRIAL

    Сообщения: 988 Репутация: N Группа: Джедаи

    Spritz 23 марта 2011 г. 13:28, спустя 16 минут 16 секунд

    В итоге сделал так:
    id - parent_id - name_en - name_ru
    20.375 записей (Страна - Регион - Город), может и не шибко красиво получилось но работает отлично, при этом добавить что-то не проблема.
    Изначально всё это было в 3х таблицах. В принципе меня бы и они устроили, но на данный момент не хочется эти самые таблицы плодить.
    from TRIAL with LOVE

Пожалуйста, авторизуйтесь, чтобы написать комментарий!