Итак, я прочитал все обсуждения RMDB против BigTable
Я пытался смоделировать простой игровой класс, используя концепции BigTable.
Цели: обеспечить очень быстрое чтение и достаточно легкую запись
Сценарий: у меня 500 000 пользовательских объектов в моей модели User. Мой пользователь видит статистику пользователя вверху своей игровой страницы (подумайте о строке состояния, как в Mafia Wars), поэтому везде, где он / она заходит в игру, статистика обновляется.
Так как он вызывается так часто, почему бы мне не смоделировать моего Пользователя вокруг этого факта?
Код:
# simple User class for a game
class User(db.Model):
username = db.StringProperty()
total_attack = db.IntegerProperty()
unit_1_amount = db.IntegerProperty()
unit_1_attack = db.IntegerProperty(default=10)
unit_2_amount = db.IntegerProperty()
unit_2_attack = db.IntegerProperty(default=20)
unit_3_amount = db.IntegerProperty()
unit_3_attack = db.IntegerProperty(default=50)
def calculate_total_attack(self):
self.total_attack = self.unit_1_attack * self.unit_1_amount + \
self.unit_2_attack * self.unit_2_amount + \
self.unit_3_attack * self.unit_3_amount + \
вот как я к нему подхожу (не стесняйтесь комментировать / критиковать)
Преимущества:
1. Все в одном большом столе
2. Нет необходимости использовать ReferenceProperty, нет отношений MANY-TO-MANY
3. Обновления выполняются очень легко: просто получите пользовательский объект по ключевому слову
4. Легко перенести запрашиваемую сущность в движок шаблонов.
Недостатки:
1. Если у меня есть 100 различных юнитов с разными возможностями (атака, защита, ловкость, магия и т. Д.), У меня будет очень ОГРОМНЫЙ стол.
2. Если мне нужно изменить значение определенной единицы атаки, то мне придется пройти через все 500 000 пользовательских сущностей, чтобы изменить каждую из них. (возможно, очередь заданий / задач cron поможет)
Каждый объект будет иметь размер 5-10 КБ (кстати, как мне проверить, насколько велик объект, когда я загрузил его на рабочий сервер?).
Так что я рассчитываю на то, что дисковое пространство в App Engine дешевое, и мне нужно минимизировать количество вызовов API хранилища данных. И я постараюсь запоминать сущность на некоторое время.
По сути, все здесь идет вразрез с RMDB
Хотелось бы услышать ваши мысли / идеи / опыт.