Этот и другие подобные вопросы часто возникают при переходе от традиционного RDB к хранилищу данных, похожему на BigTable, например App Engine.
Часто бывает полезно обсудить , почему хранилище данных не поддерживает уникальные ключи, поскольку оно информирует вас о том, какой образ мыслей вам необходим, когда вы думаете о ваших схемах хранения данных. Причина, по которой уникальные ограничения недоступны, заключается в том, что это сильно ограничивает масштабируемость. Как вы сказали, применение ограничения означает проверку всех других объектов на это свойство. Независимо от того, делаете ли вы это вручную в своем коде или хранилище данных делает это автоматически за кулисами, это все равно должно произойти, а это означает снижение производительности. Некоторые оптимизации могут быть сделаны, но это все равно должно произойти так или иначе.
Ответ на ваш вопрос: подумайте, зачем вам это уникальное ограничение.
Во-вторых, помните, что ключи do существуют в хранилище данных и являются отличным способом применения простого уникального ограничения.
my_user = MyUser(key_name=users.get_current_user().email())
my_user.put()
Это гарантирует, что MyUser
никогда не будет создан с этим электронным письмом, и вы также можете быстро получить MyUser
с этим электронным письмом:
my_user = MyUser.get(users.get_current_user().email())
Во время выполнения Python вы также можете сделать:
my_user = MyUser.get_or_create(key_name=users.get_current_user().email())
Который будет вставлять или извлекать пользователя с этим электронным письмом.
Все, что сложнее, не будет масштабируемым. Так что подумайте, нужно ли вам, чтобы это свойство было глобально уникальным, или есть способы устранить необходимость в этом уникальном ограничении. Часто вы обнаружите, что с некоторыми небольшими обходными путями вам не нужно, чтобы это свойство было уникальным.