Проблема, не могу сделать уже 3 дня. (деревья)

Spear

почемучка
Проблема, не могу сделать уже 3 дня. (деревья)

Здравствуйте.
Делаю игру (не кидайте в оффтопик, пожалуйста, просто объясняю что делаю).
Все локации хранятся в одной таблице:
ID - уник. номер локации
name - название
type - числовое. 1 - город, 2 - район, 3 - улица, 4 - здание на улице

Проблема вот в чем:
информация о текущем местоположении игрока (пользователя) - это ID одной единственной локации. Знаю этот ID мне нужно вывести полную информацию о местоположении.
Пример:
Город Н > Район Х > улица Ленина > Дом Культуры > отдел такой-то.

Это первая проблемка. Я не могу сообразить как же это сделать.

Вторая необходимая функциональность: нужно иея номер локации вывести список всех пользователей в этой И ДОЧЕРНЕЙ ей локациям.
Например запросить список юзерв в локации какого-то района - вывести список всех также со всех улиц этого района, всех зданий в нем и всех комнат зданий.

У меня уже голова пухнет.. я просто сижу и понятия не имею как это сделать, учитывая что нагрузка будет неслабая и кол-во локаций тоже немаленькое. Сами локации будут время от времени изменяться, так что, скажем, у района номе 32432 одна из улиц может оказаться с номером 232. Пример грубый.

Пожалуйста, помогите! У меня просто крыша едет!
Читал про nested sets и так далее. Может я просто чего не сообразил. Подскажите, буду очень и очень благодарен!

-~{}~ 09.05.06 07:19:

Nested sets использовать не хочу.
Попробовал сделать структуру вида
id | parent| name
забил в базу 3 города, в каждый по 15 районов, в них - по 10 улиц, на улице 5 зданий а здании по 5 комнат (да, много - но это все же тест),
Вышло всего почти 15 000 записей. Делал "рекурсие" (если я правильно понял заничение этого слова). Короче говоря выбрать все номера локаций города (районы, улицы, здания, комнаты) - 916 запросов :) То есть дохрена.

Хотелось бы что-то полечге для БД.
Нашел темку http://forum.dklab.ru/sql/php/IerarhicheskieStrukturiVBd.html
там похожая структура - id | parent НО ещё есть поле level - что там хранить я из топика не понял.

Буду рад за объяснения или советы - как же лучше сделать.
 

Andreika

"PHP for nubies" reader
не читал, но level это скорее всего уровень вложенности.

информация о текущем местоположении игрока
а в цикле 3-4 запроса это жирно получится?

говоря выбрать все номера локаций города
интересно, где такое может понадобицца?

PHP:
// це не пхп код )
$ids = $cityid;
while (true) {
array $row = SELECT parent,id FROM table WHERE parent IN ($ids)
if (!$row) break;
$res[$row[parent]] = $row[id];
$ids = implode(',',$row[id]);
}
-~{}~ 09.05.06 15:22:

хотя... мож это все изобретенный лисопед
 

Spear

почемучка
Andreika
да не, 4 запроса в цикле для того чтобы узнать полный путь к локации игрока - не жирно.
а вот показать список всех пользователей в таком-то городе.. да что там городе - даже в таком-то районе.
сначала надо выбрать айдишники локаций. дочерние для локации 5 (пусть это будет район). Потом нужно выбрать из базы айди локаций, у которых родители - любая улица района (это выбрали здания).
потом выбрать айдишники, у которых родители - здания.
короче как я и сказал - огромное кол-во запросов.
 

Andreika

"PHP for nubies" reader
Spear
но не 916, а всего лишь MAX уровень вложенности +1
если тя это не устраивает - храни избыточную инфу - ид города или чего там надо для каждого перса
 

Spear

почемучка
КАЮСЬ! :) протупил ужасно.
Да, я как самый настоящий.. *чайнег* делал запросы в в циклах и так далее.
Просто протупил.
Да, теперь все гораздо проще - получается сначала считаю айди районов
потом считаю айди локаций, у которых паренты IN($disticts) и так далее.

Собсно отсюда вопрос - вообще так стоит делать? Учитывая что хоть я и задаю такие дурацкие вопросы но игра будет довольно сложной и обхемной.. вообщем неважно - как сам способ?

-~{}~ 09.05.06 08:49:

Ещё - при такой структуре "дерева" - стоит отделять само "дерево" от прочей информации? как минимум это название, тип локации, описание и ещё 2-3 числовых поля
 
Сверху