2013-08-28 15 views
-1

У меня есть дерево-алгоритм и проблема с базой данных, на которую я хотел бы получить ответ.Дерево PHP/MySQL, которое является inifinite

У меня есть несколько областей, допустим, 20. Каждая из этих областей имеет подзоны ~ 20 каждый. Эти родительские районы размещены на карте. Некоторые из этих родительских областей расположены близко друг к другу.

База данных выглядит следующим образом: [area_id, название, parent_id] - Некоторые имеет несколько детей, есть корневой узел, содержащий все области. (смежности Список Model)

Чтобы сделать это в картину, которую я мог бы сделать это: Basic Tree View

Различные области, как я сказал, может быть близко к Афоризм, (или далеко). Я хотел бы как-то связать, скажем, Площадь 1 и Площадь 5 вместе, потому что я знаю, что они близки, и Площадь 1 также находится недалеко от Района 4. Теперь, вот в чем проблема, скажем, что Площадь 4 также близко к зоне 5.

это будет выглядеть как-то вроде этого: Problem tree

что делает его infitite цикл? потому что я хочу Area 1, чтобы быть ближе к зоне 4, но и зона 4 находится близко к зоне 1.

Я хотел бы сделать поиск, где вы можете выбрать «поиск близлежащих районов», так вы выбираете одну область, затем можете искать близлежащие. Я мог бы использовать некоторые советы, как решить эту проблему с помощью базы данных и php.

Я искал на этом форуме помощь, но я действительно не знаю «имя» этой проблемы, я был бы счастлив, если бы кто-то мог указать мне в правильном направлении или прямо помочь мне в тонкой нити.

Спасибо, ребята,, и если это что-то еще вам нужно знать, я постараюсь ответить как можно скорее.

+0

Я не понимаю, почему вы ** действительно ** должны ** повторять ** ОБЛАСТЬ 1 -> AERA 5, AERA 4 ... В первый раз может быть достаточно знать, что эти три узла связаны. – Sugar

+0

Благодарим вас за ответ. Вопрос в том, как бы что-то подобное выглядело в базе данных? с примерно 20 районами, которые связаны по-разному (близко друг к другу), это будет действительно большой стол, всего лишь для 20 областей, не так ли? – Asbestos

ответ

1

Для всего, что имеет дело с близостью, я бы, безусловно, использовал подход к геофизической информации (если это истинные области/регионы), а затем применяя радиальный поиск, который можно выполнить с помощью любого количества простых до сложные запросы и вычисления.

Если эти места, с другой стороны, вымышленные, может быть интересно рассмотреть возможность создания фальшивого местоположения - даже если это простая система координат x, y. Это позволит вам снова выполнять радиальные поиски, которые вы можете увеличить или уменьшить до ваших потребностей, или даже просто упорядочить результаты на восходящем расстоянии от сайта a до b.

+0

Это базовое означает, что вы создаете систему координат X-Y и вычисляете расстояние между ними? Проблема в том, что некоторые из них касаются друг друга (соседние), и те области, которые я хочу найти, в основном самые близкие области, которые касаются, я посмотрю на радиальный поиск, спасибо! – Asbestos

+0

Да, если вы используете long/lat, вы хотите использовать [Формулу Хаверсина] (http://en.wikipedia.org/wiki/Haversine_formula), в противном случае это простое [координатное расстояние] (http: // www. mathopenref.com/coorddist.html). – Fluffeh

1

Чтобы разделить область, вам нужен прямоугольник, который можно разделить вдоль оси. Посмотрите на kd-дерево, r-дерево или квадранты и пространственный индекс. Я могу порекомендовать вам свою кривую Гильберта класса php. Это кривая монстра и полностью заполняет плоскость. Вы можете найти его на phpclasses.org.

+0

Спасибо, я посмотрю! – Asbestos

-1

Я, наконец, решил его использовать своего рода «соседний» выбор.

Я сделал это, создав другую таблицу, которая содержит отношения соседа.Эта таблица выглядела так: [table_id, area_id, neighbor_area_id]

Здесь я добавил все соседи, которые имеющиеся, с некоторыми INNER JOIN и выберите Постулаты мне удалось получить то, что я хотел, так что поиск может быть сделано для всех областей, соседствующих с выбранным.

СКП-Постулаты выглядел следующим образом:

SELECT adds.title, categories.title, area.title 
FROM adds 
INNER JOIN categories ON categories.category_id = adds.category_id 
INNER JOIN areas ON adds.area_id = areas.area_id 
WHERE areas.area_id IN (SELECT area_neighbors.area_neighbor_id 
         FROM area_neighbors 
         WHERE area_id='25') 
OR adds.area_id='25' 

Это дало бы мне все добавляет в соседних районах, area_id 25.

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

+0

Откуда вы получили информацию для столбца соседа? – Bytemain

+0

Это то, что я придумал сам. Я делаю соседний столбец, добавляя id, которые являются «соседями» к самому идентификатору области. – Asbestos

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

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