0

Я исхожу из фона SQL, и мне интересно, как сделать фильтры в NDB, которые будут эквивалентны многим объединениям в SQL и как сделать эти запросы масштабными. В качестве примера:NDB: фильтрация по свойствам на нескольких объектах

class PromDate(ndb.Model): 
    user_id = ndb.StringProperty(required=True) # user id 
    age = ndb.IntegerProperty() 

class DesignerBrand(ndb.Model): 
    name = ndb.StringProperty() 

class Socks(ndb.Model): 
    owner = ndb.KeyProperty(kind=PromDate, required=True) # reference to PromDate 
    designer = ndb.KeyProperty(kind=DesignerBrand, required=True) # reference to DesignerBrand 
    color = ndb.StringProperty() 
    do_they_smell = ndb.BooleanProperty() 

class Tie(ndb.Model): 
    owner = ndb.KeyProperty(kind=PromDate, required=True) # reference to PromDate 
    designer = ndb.KeyProperty(kind=DesignerBrand, required=True) # reference to DesignerBrand 
    color = ndb.StringProperty() 

Если мы хотим найти PromDate над 21, которому принадлежит синий Calvin Klein или Target носки, которые не пахнут и красный галстук, как нам лучше сделать это без использования StructuredProperties? Примерный запрос был бы чрезвычайно полезен.

Каковы компромиссы между использованием ассоциаций с такими ключами, как указано выше, и помещением носков/галстука в качестве повторного структурированного свойства PromDate? В частности, меня беспокоят ограничения по размеру (1 МБ, согласно документам), если мы добавим в наш PromDate множество других предметов одежды (например, сотни тысяч).

В принципе, как мы должны думать о сложных запросах, подобных этому в NDB? Как мы сохраняем их быстрыми и простыми - и, самое главное, масштабируемыми при больших объемах данных?

+0

читать другие ответы, как http://stackoverflow.com/questions/11748695/most-efficient-one-to-many-relationships-in-google-app-engine- datastore, похоже, что решение StructuredProperty, безусловно, не будет работать с ограничением размера 1 МБ и преемником 5 000 повторных свойств. Поэтому, я думаю, мой главный вопрос заключается в том, как выполнить запрос жирным шрифтом. –

+1

К сожалению, мне кажется, вам понадобятся несколько запросов, чтобы уничтожить список необходимых вам экземпляров 'PromDate'. Это NoSQL для вас: чем более тщательно вы нормализуете свою схему, тем хуже, потому что, видите ли, ** нет объединений **! Де-нормализация (со структурированными свойствами иногда, проще всего в другое время - например, просто используйте имя дизайнера вместо ключевого слова конструктора, чтобы вы могли запросить его напрямую) немного поможет, но это по-прежнему совсем другой мир от реляционные БД (поэтому реляционные БД по-прежнему предлагаются, например Google Cloud SQL, в качестве альтернатив). –

+0

Я думаю, что ты прав. Если вы хотите представить это как ответ, я рад принять его. Я думаю, что этот пример может быть полезен людям, которые изучают ограничения/проблемы перевода реляционных схем в хранилища ключей. –

ответ

1

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

Это для вас NoSQL: чем более тщательно вы нормализуете свою схему, тем хуже может быть, потому что, видите ли, нет объединений!

Де-нормировка (со структурированными свойствами иногда, проще всего в другое время - например, просто используйте имя дизайнера вместо ключевого слова конструктора, чтобы вы могли запросить его напрямую) поможет немного, но это все еще совсем другой мир от реляционных БД (поэтому реляционные БД по-прежнему предлагаются, например Google Cloud SQL, в качестве альтернатив).

1

Вы можете денормализовать свои данные и сформировать структурированное свойство, а затем запустить на нем несколько фильтров.

Из своих образцов:

class Address(ndb.Model): 
    type = ndb.StringProperty() # E.g., 'home', 'work' 
    street = ndb.StringProperty() 
    city = ndb.StringProperty() 

class Contact(ndb.Model): 
    name = ndb.StringProperty() 
    addresses = ndb.StructuredProperty(Address, repeated=True) 

def query_contact_multiple_values_in_single_sub_entity(): 
    query = Contact.query(Contact.addresses == Address(city='San Francisco', 
                 street='Spear St')) 
    return query 
Смежные вопросы