Логика для эффективной реализации отношений между родителями и детьми - PullRequest
0 голосов
/ 22 декабря 2009

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

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

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

В поисках вашей помощи и поддержки.

1 Ответ

0 голосов
/ 22 декабря 2009

Исходя из вашей структуры вывода, я предполагаю, что ваши данные представляют собой дерево. Поэтому у вас есть простой запрос «получить все дочерние элементы узла» как 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]
...