Логика для эффективной реализации родительско-дочерних отношений

У меня есть таблица, в которой родительские отношения хранятся как:
ChildID Name ParentID
1 A1 Null
2 A2 1
3 B1 Null
4 A3 2
5 A4 1< br> Я работаю над Objective C, и мне нужно сгенерировать текстовый файл следующим образом:
Имя =A1> Имя =A2> Имя =A3/> Имя =A2/>
Имя =A4/>
Имя =B1/>

Я использовал подход, при котором я сначала ловил последний элемент (Id = 5), а затем проверял все остальные узлы, чтобы получить его родительские узлы. n Сложность становится равной n*n-1. Есть ли другой лучший подход, так как этот подход не работает, когда у нас есть большие данные в базе данных.

Структура базы данных гибкая, мы можем изменить это, если есть что-то лучше...

Жду вашей помощи и поддержки.


person Ashok Gupta    schedule 22.12.2009    source источник


Ответы (1)


Исходя из вашей выходной структуры, я предполагаю, что ваши данные представляют собой дерево. Таким образом, у вас есть простой запрос «получить все дочерние элементы узла» как SELECT childId, name FROM tree WHERE parentId = ?, который позволяет выполнять стандартный обход дерева. Псевдокод:

def displayNode(node)  
  children = selectChildren(node.id)
  if (empty(children)) 
    print '<'+node.name+'/>'
  else 
    print '<'+node.name+'>'
    for (child in children) 
      displayNode(child)
    print '</'+node.name+'>'

Оптимизация, если выполнение одного запроса на узел слишком много (что, вероятно, так и есть), заключается в выполнении одного запроса для получения всех данных и помещения их в оптимизированную структуру данных:

for (node in selectAllNodes())
  nodes[node.parent].append(node);

def selectChildren(id)
  return nodes[id]
person Victor Nicollet    schedule 22.12.2009