Так что я прочитал все RMDB против BigTable дебатыApp Engine Простая игра Модель Эксперимент (Scalable)
Я попытался смоделировать простой класс игры, используя BigTable понятия.
Цели: Обеспечить очень быстро читает и значительно легко пишет
Сценарий: У меня есть 500000 объектов пользователя в моей модели пользователя. Мой пользователь видит статистику пользователя в верхней части своей страницы (подумайте о статусной строке, как в 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, нет МНОГИЕ-МНОГИЕ отношения
3. Обновления очень легко выполняются: просто получите пользовательский объект по имени
4. Легко передать запрошенный объект на шаблонный двигатель.
Недостатки:
1. Если у меня есть 100 различных единиц с различными возможностями (атака, защита, ловкость, магия и т. Д.), Тогда у меня будет очень ОГРОМНЫЙ стол.
2. Если мне нужно изменить значение определенной единицы атаки, мне придется пройти через все 500 000 пользовательских объектов, чтобы изменить каждый из них. (возможно, задача cron job/task help)
Каждый объект будет иметь размер 5-10 kb (кстати, как я могу проверить, насколько велика сущность, как только я загрузил их на производственный сервер?).
Так что я рассчитываю на то, что дисковое пространство в App Engine дешево, и мне нужно свести к минимуму количество вызовов API хранилища данных. И я попытаюсь memcache сущности в течение определенного периода времени.
В сущности, все, что здесь идет против RMDB
Хотелось бы услышать ваши мысли/идеи/опытом.
привет, я сделал пересмотренную модель, основанную на ваших взглядах. см. ниже (я включил его в качестве ответа) хотел бы услышать ваши мысли об этом – fooyee