Должен ли я использовать NDB или API поиска для хранения пользовательской модели?
Предположим, у меня есть базовая модель User в ndb со следующими свойствами:
`` `
name = ndb.StringProperty(default='')
username = ndb.StringProperty(required=True)
email = ndb.StringProperty(default='')
active = ndb.BooleanProperty(default=True)
admin = ndb.BooleanProperty(default=False)
permissions = ndb.StringProperty(repeated=True)
verified = ndb.BooleanProperty(default=False)
token = ndb.StringProperty(default='')
password_hash = ndb.StringProperty(default='')
bio = ndb.StringProperty(default='')
location = ndb.StringProperty(default='')
facebook = ndb.StringProperty(default='')
twitter = ndb.StringProperty(default='')
gplus = ndb.StringProperty(default='')
github = ndb.StringProperty(default='')
`` `
Допустим, я хочу выполнить LIKE запрос на полях name
username
bio
Я прочитал этот ответ о NDB и API поиска, и мне не ясно, стоит ли мне хранить только name
username
bio
через API поиска и отдых в NDB и вручную поддерживать их согласованность, или я должен сохранить все свойства через API поиска, чтобы поиск данных мог быть быстрее / проще.
Спасибо за любые предложения:)
2 ответа
Вы должны хранить любые важные данные в хранилище данных. Он имеет избыточность и отказоустойчивость - это ваш "МАСТЕР".
Затем вы должны передать данные для поиска... ждать его... поиск! Это может включать идентификатор вашей записи в хранилище данных.
Затем вы можете получить свой полный объект данных из Memcache или Datastore с помощью пакетной загрузки, если вам нужно больше полей, чем представлено в документе поиска.
Я никогда не видел каких-либо обязательств по согласованию в отношении API полнотекстового поиска (т. Е. Сильной или возможной согласованности), он также не может участвовать в транзакциях.
Это означает, что, хотя он полезен для выполнения аналогичного запроса, вы должны полагаться на какой-то другой механизм хранения в качестве основного источника данных.
Так что сохраните в хранилище данных, индексируйте интересные поля в поисковый индекс. При запросе выполняйте поиск в индексе поиска, а затем используйте идентификатор / ключ из результата для поиска данных из хранилища данных (убедитесь, что соблюдаются все ограничения согласованности).