Я исхожу из фона 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? Как мы сохраняем их быстрыми и простыми - и, самое главное, масштабируемыми при больших объемах данных?
читать другие ответы, как http://stackoverflow.com/questions/11748695/most-efficient-one-to-many-relationships-in-google-app-engine- datastore, похоже, что решение StructuredProperty, безусловно, не будет работать с ограничением размера 1 МБ и преемником 5 000 повторных свойств. Поэтому, я думаю, мой главный вопрос заключается в том, как выполнить запрос жирным шрифтом. –
К сожалению, мне кажется, вам понадобятся несколько запросов, чтобы уничтожить список необходимых вам экземпляров 'PromDate'. Это NoSQL для вас: чем более тщательно вы нормализуете свою схему, тем хуже, потому что, видите ли, ** нет объединений **! Де-нормализация (со структурированными свойствами иногда, проще всего в другое время - например, просто используйте имя дизайнера вместо ключевого слова конструктора, чтобы вы могли запросить его напрямую) немного поможет, но это по-прежнему совсем другой мир от реляционные БД (поэтому реляционные БД по-прежнему предлагаются, например Google Cloud SQL, в качестве альтернатив). –
Я думаю, что ты прав. Если вы хотите представить это как ответ, я рад принять его. Я думаю, что этот пример может быть полезен людям, которые изучают ограничения/проблемы перевода реляционных схем в хранилища ключей. –