Google App Engine - пользователи, списки и продукты, а также вопрос о присоединении. - PullRequest
2 голосов
/ 30 июня 2011

Давайте возьмем эти модели:

User
  - name

Product 
  - name
  - category

List 
  - name
  - creation_date
  - user (reference)

Product_List
  - list ( reference)
  - product ( reference)

Как я могу получить список продуктов, которые остаются вне списка?

  • Должен ли я получить их все, а затем удалить их программно (разве это не сделает запрос медленнее?)

    1. Получить все товары определенного списка определенного пользователя
    2. Получить все продукты
    3. Извлечь разницу (вложенный для?)

Извините, я новичок в этом, предложения и комментарии приветствуются!

Спасибо!

Ответы [ 2 ]

2 голосов
/ 01 июля 2011

Если вы структурируете свои данные следующим образом:

class Product(db.Model):
  # ...

class UserInfo(db.Model):
  # ...

class ProductList(db.Model):
  owner = db.ReferenceProperty(UserInfo)
  products = db.ListProperty(db.Key)

Затем вы можете получить товары, отсутствующие в списке, например:

product_keys = set(Product.all(keys_only=True).fetch(1000))
product_list = ProductList.get_by_id(product_list_id)
missing_products = product_keys - set(product_list.products)

missing_products - это набор ключей, которые вы можете передать db.get для получения соответствующих сущностей продукта.

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

0 голосов
/ 30 июня 2011

Для этой конкретной работы по очистке вы можете использовать карту уменьшения для сканирования вашего набора Product_Lists.

В будущем постарайтесь не допускать возникновения таких ситуаций -например, вы можете сделать каждый список группой сущностей, а при удалении списка также удалить все связанные списки Product_Lists в одной и той же транзакции.Или же полностью исключите Product_Lists и просто используйте свойство списка в самой сущности List.

В общем, отсутствие объединений - это жертва, которую вы должны принести для масштабируемости.Многие объединения эффективны только тогда, когда весь набор данных находится в локальной памяти;таким образом, если у вас слишком большая база данных для размещения на одном сервере, вам всегда нужно жертвовать объединениями.Это может означать серьезные изменения в вашей схеме и / или превращение некоторых операций в пакетные задания.GAE просто заставляет вас вносить эти изменения в дизайн заранее, когда это легче сделать, а не позже, когда у вас мало времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...