2012-02-19 3 views
1

Использование AppEngine datastore, но это может быть агностиком, не знаю.Хранение данных: группирование объектов по значению свойства? (например, словарь/карта?)

Предположим, что объект базы данных называется Comment. Каждый Comment относится к User. Каждый Comment имеет свойство date, довольно стандартное до сих пор.

Я хочу что-то, что позволит мне: назначьте User и получить обратно словарь-иш (. Исходя из фона Python, пардон хэш-таблицы, карты, однако следует назвать в этом контексте) структуры данных, где:

  • клавиши: каждый date появляться в комментарии User «s
  • значения: Comments, которые были сделаны на date.

Я думаю, я мог бы просто перебирать ряд дат, построить такую ​​же карту самостоятельно, но я серьезно сомневаюсь, что мне нужно «изобрести» свое собственное решение здесь.

Есть ли способ/инструмент/техника для этого?

ответ

2

Datastore поддерживает как ссылки, так и свойства списка. Это позволяет вам построить один-ко-многим двух способов:

  1. Родитель (Пользователь) имеет свойство списка, содержащие ключи дочерних объектов (комментарий).

  2. Ребенок имеет ключевое свойство, указывающее на родителя.

Поскольку вам нужно ограничить комментарии по дате, вам лучше всего пойти с вариантом два. Затем вы можете запросить комментарии, которые имеют дату = somedate (или диапазон дат) и где user = someuserkey.

В Datastore нет встроенной функциональности группировки, поэтому, чтобы также «группировать» по дате, вы можете добавить сортировку по дате в запрос. Затем, когда вы перебираете результат, при изменении даты вы можете использовать/хранить его в качестве ключа группировки.

Update

не Проектирование нет-SQL базы данных должен быть доступ-ориентированной (по сравнению с DataModel ориентированной в SQL): для часто используемых операций, которые вы должны получать данные, как дешево (=, как несколько операций), как это возможно ,

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

+0

На самом деле, # 2 неявно делает # 1: он создает свойство _set в родительском объекте, поэтому на самом деле это не два разных подхода, не так ли? В любом случае, так, немой итерации и наблюдения за изменениями в dateit? Я действительно надеялся на что-то MapReduce-esque. Или проиндексировать. Ну что ж. Но я буду продолжать смотреть. Я хочу что-то приятнее. – ntl0ve

+0

Нет, конечно, не на Java. Я не использую Python, но совершенно уверен, что это не так. 1. и 2. делать ссылки в разных направлениях: в 1. родительских точках к детям, в 2. ребенок указывает на родителя. –

+0

Сокращение карты - это всего лишь метод обработки большого фрагмента данных, разбиение его (сопоставление) и выполнение некоторой операции, которая дает некоторый результат (сокращение). Он был в основном полезен при работе с отчетами/OLAP и системами NoSQL, которые не имели классических запросов. –

0

Начну с того, что вы не должны извиняться за наличие фона на Python. App Engine начал поддерживать только Python. Используя модуль db, вы можете иметь объект User как родительский элемент нескольких сущностей DailyCommentBatch, каждый из которых является родителем нескольких объектов Comment. IIRC, это сохранит все связанные сущности, сохраненные вместе (или закрытые).

Если вы используете NDB (я люблю его), вы можете использовать StructuredProperty либо на уровнях User, либо на DailyCommentBatch.