Моделирование «многие-ко-многим» с данными отношения в Google App Engine

У меня две модели в моей заявке: «Сделка» и «Человек», с отношением «многие ко многим». В каждую Сделку входят лица. Для каждого человека есть также сумма, связанная с каждой транзакцией, с которой связан человек. Поэтому мне нужно смоделировать отношение «многие ко многим» с данными отношения. Google предлагает такой подход:

http://code.google.com/intl/sv-SE/appengine/articles/modeling.html

При таком подходе у меня есть такая модель:

class TransactionPerson(db.Model): # References transaction = db.ReferenceProperty(Transaction, required=True) person = db.ReferenceProperty(Person, required=True) # Values amount = db.FloatProperty(required=True) 

Но я считаю, что это очень плохо для производительности, потому что, если мне нужно суммировать сумму для каждого Лица во всех транзакциях, мне нужно выполнить транзакцию Person * Transaction * TransactionPerson, чтобы реализовать «объединение» при суммировании сумм.

МОЯ ИДЕЯ

Моя идея состоит в том, чтобы иметь два списка в модели транзакций:

 class Transaction(db.Model): persons = ListProperty(db.Key) persons_amount = ListProperty(float) 

Таким образом, мне не нужно перебирать все транзакции TransactionPerson для каждого человека, чтобы найти связанную транзакцию. И я все еще могу запросить транзакции на основе Person.

ВОПРОСОВ

  1. Это возможно? Можете ли вы доверять, что порядок списка всегда один и тот же при сохранении / восстановлении, чтобы индексы синхронизировались между списками?
  2. Является ли это хорошим способом реализации отношений «многие ко многим» со связанными данными?

2 Solutions collect form web for “Моделирование «многие-ко-многим» с данными отношения в Google App Engine”

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

Предпочтительным подходом является вычисление сводных данных заблаговременно .

В конкретном случае «Итоговые транзакции на человека» это означает, что вы хотите добавить дополнительное поле в модель Person и обновить его с общей суммой всех своих транзакций. Вы обновляете это в любое время, когда TransactionPerson будет изменен, так что итоговое значение всегда будет правильным.

1. Да, вы можете положиться на поддерживаемый заказ. Из документов :

когда сущности возвращаются запросами и get (), значения свойств списка находятся в том же порядке, что и при их сохранении. Есть одно исключение: значения Blob и Text перемещаются в конец списка; однако они сохраняют свой первоначальный порядок относительно друг друга.

2. Да, ListProperties – ваши друзья для де-нормализации отношений. Я стараюсь много дублировать данные и таким образом использую такие свойства списка, как «кэши» де-нормализованных данных.

  • Как получить что-то случайное в хранилище данных (AppEngine)?
  • Почему этот код получает этот объект «str», не имеет атрибута «get_match_routes»?
  • Python FileNotFoundError: Нет такого файла или каталога
  • Шаблоны Django и переменные атрибуты
  • Перемещение Blobstore в GCS: Google App Engine Python
  • Решить путь обнаружения на модуле App Engine
  • Свойство пользователя повреждено в хранилище данных:
  • Google Calendar API v3 - Как получить токен обновления (Python)
  •  
    Interesting Posts for Van-Lav

    Прокрутите все файлы CSV в папке

    Преобразование float в строку без научной нотации и ложной точности

    Диспетчер списка Django List + ForeignKey = пустой список изменений

    Каков наилучший метод вызова программы Python 3.x из Python 2.x?

    Воспроизведение звука из данных, хранящихся в переменной в Python

    UnicodeEncodeError при использовании метода pandas to_sql на фрейме данных с именами столбцов Unicode

    Считываемый эквивалент C # операции кусочка Python

    Изображение холста tkinter не отображается

    Перенаправить вывод интерактивных команд python / ipython в файлы или переменные

    Python datetime strptime () и strftime (): как сохранить информацию о часовом поясе

    pandas Ошибка DataFrame "no numeric data to plot"

    Ошибка «1 столбцы вместо …» в numpy

    Получите IP-маску от IP-адреса и длины маски в Python

    Может кто-нибудь объяснить мне следующий пример os.fork ()?

    как извлечь границы изображения (изображение сканирования OCT / сетчатки)

    Python - лучший язык программирования в мире.