дизайн базы данных в Google App Engine - PullRequest
3 голосов
/ 18 апреля 2010

Я разрабатываю простой проект, основанный на списке дел.Идея состоит в том, чтобы определить задачи в рамках проекта (без рабочего процесса - просто «задача выполнена» или нет).то есть каждая задача имеет несколько задач, и эта задача может иметь другую задачу.можно сказать, что проект завершен, если все задачи по этому проекту выполнены.Я пытался использовать refrenceproeperty для создания иерархии, но не мог найти простой способ (который не занимает более 30 секунд, чтобы найти всех детей проекта и проверить, завершен он или нет).определить, завершен ли проект или нет.Как разработать базу данных для такой работы?а также, если мне нужно скопировать проект для определения другого проекта, как скопировать иерархические данные?

Ответы [ 2 ]

3 голосов
/ 18 апреля 2010

Основная философия хранилища данных App Engine, как и для других баз данных nosql, заключается в том, чтобы выполнять свою работу при записи, а не при чтении. Имея это в виду, вы можете использовать родительские отношения, как предлагает Адам, и вести «неполный подсчет» для каждого узла, который подсчитывает количество непосредственных дочерних элементов, которые еще не завершены. Когда вы отметите узел как завершенный, уменьшите счетчик его родительского узла; если это приводит к полноте, перейдите к его родителю и так далее. С такой структурой вы можете мгновенно показать, завершена ли задача или нет.

0 голосов
/ 18 апреля 2010

Вероятно, лучше всего реализовать иерархию задач, указав родительский объекта задачи для объекта задачи или объекта проекта, к которому он принадлежит.

Я думаю, что хитрость для определения того, завершены ли все дочерние элементы проекта или нет, заключается в использовании запросов ANCESTOR.

Если вы создаете записи своей задачи таким образом, чтобы их родительский элемент был установлен на задачу или проект, к которому они принадлежат, вы сможете написать что-то вроде этого:

all_done = db.Query().ancestor(project_entity).filter('complete = ', False).count()
if all_done > 0:
    #Not all done
else:
    #All done
...