Эффективное извлечение объектов, которые соответствуют любому элементу из набора идентификаторов - PullRequest
1 голос
/ 06 октября 2010

Я пишу программное обеспечение для обратной связи с людьми из разных категорий.Например, у меня может быть 30 сотрудников и 40 стандартов оценки (например, «приходит вовремя», «вежлив», «кажется, чистит зубы» и т. Д.).В любое время руководитель может отправить отзыв, например, «сотрудник 3 получает 5/5 за стандарт 8 (он пахнет великолепно)» или «сотрудник 10 получает 1/5 за стандарт 12 (он просто назвал клиента идиотом»).). "

Моя идея состоит в том, чтобы хранить эти небольшие фрагменты обратной связи по отдельности, привязанные к сотруднику и стандарту, сохраняя поля userId и standardId.

Проблема возникает, когда я хочу посмотреть наобратная связь для всех 30 сотрудников и 40 стандартов.Мой текущий подход требует 1200 запросов для получения всех этих данных.Я ищу лучший способ.Я использую хранилище данных Google Appengine, которое представляет собой нереляционную базу данных.

Вещи, о которых я думал, и о которых я приветствую отзывы:

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

  2. Я мог бы хранить все отзывы для определенной(набор пользователей x набор стандартов) в неорганизованном списке, получить его одним запросом, а затем отсортировать в моем собственном коде.Это требует от меня циклического прохождения 1200 записей, но это будет быстрее, чем 1200 запросов ко всем данным во всей системе (может быть много, много не относящихся к делу данных для других наборов пользователей и несвязанных стандартов).

Итак, краткая версия моего вопроса: как мне хранить эти данные для лучшего баланса быстрого поиска большого подмножества и быстрого ввода отдельных фрагментов обратной связи?

1 Ответ

1 голос
/ 06 октября 2010

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

Идея довольно проста, в основном вы будете хранить список "стандартов" для каждого сотрудника. И, возможно, список сотрудников для каждого стандарта. Тогда вы сможете задавать вопросы, например, всем сотрудникам, которые «хорошо пахнут».

Поскольку у вас есть оценки для каждого стандарта, вы можете захотеть сделать что-то вроде сохранения «счета» и «номера стандарта» в виде пары в списке («3:12»), чтобы вы могли найти всех, у кого 3 балла по стандарту 12.

edit : Обновлено на основе комментария.

Похоже, вам нужно разобраться с несколькими разными проблемами. Во-первых, вам нужно заниматься редактированием и ведением данных. Во-вторых, вам нужно иметь дело с запросом данных. В-третьих, вам нужно будет обработать отображение данных.

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

Если вы имеете дело только с 30 или 40 сотрудниками и 30 или 40 стандартами, возможно, вы могли бы использовать что-то вроде следующего:

class Evaluations(db.Model):
    period = db.StringProperty()
    standards = db.TextProperty()
    scores = db.TextProperty()

class EvaluationsIndex(db.Model):
    index = db.StringListProperty()

Используйте свойство стандартов в оценках для хранения списка оцененных стандартов. Затем сохраните сетку стандартных показателей сотрудника в свойстве показателей. Очевидно, вам нужно будет сериализовать как список стандартов, так и таблицу оценки, возможно, используя что-то вроде JSON. Используйте модель EvaluationsIndex, как я упоминал выше.

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

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

...