У меня есть Django модели:Как эффективно хранить ранжированный список объектов в Django?
from django.db import models
class Player(models.Model):
name = models.CharField(max_length=254, null=True, blank=True,)
score = models.IntegerField()
A = Player.create(name="A", score=99)
B = Player.create(name="B", score=66)
C = Player.create(name="C", score=66)
D = Player.create(name="D", score=55)
E = Player.create(name="E", score=44)
Я хочу, чтобы сохранить рейтинг всех моих игроков по счету. Если у игроков одинаковый балл, у них будет тот же ранг. Так что в этом случае рейтинг будет выглядеть следующим образом:
Name Score Rank
A 99 1
B 66 2
C 66 2
D 55 4
E 44 5
Я хочу сохранить этот рейтинг в базе данных, так что я не постоянно приходится выполнять ресурсоемкие запросы сортировки. Мне нужно, чтобы эффективно выполнять все следующие операции:
- Данный игрок, LookUp их ранг
- Учитывая звание, выяснить, какой игрок (ы) есть, что ранг
- Данный плеер, вставить их в этот рейтинг
- Учитывая игрок, удалить их из этого рейтинга
- Учитывая игрок и счет, обновить свою позицию в этом рейтинге
Мне нужно будет вставить и удалить игроков из этого списка. Всякий раз, когда я делаю # 3, # 4 или # 5, мне нужно будет обновить ряды других игроков, чтобы сохранить целостность рейтинга.
Каков наиболее эффективный способ сделать это в Django? Как мне создать мои модели, чтобы это работало эффективно, а мои операции с базой данных были минимальными? Пожалуйста, покажите мне, как выглядят новые модели.
* «Когда я делаю # 3, № 4 или № 5, мне нужно будет обновить ряды других игроков ...» * - это еще дороже, чем вычисление рангов на лету. Хранение рангов в базе данных кажется плохой идеей, если вам придется обновлять их каждый раз, когда вы вставляете/удаляете игроков. – xyres
Кроме того, запрос может быть намного быстрее, если все в памяти. См. [Memcached] (http://memcached.org) или [Redis] (http://redis.io) для кэширования базы данных в памяти. – xyres
Xyres, я не могу легко вычислить эти ряды «на лету», используя только предложение базы данных «order by», потому что, как вы можете видеть, моя функция ранжирования немного сложнее (т. Е. Могут быть два игрока, занявших первое место). Также вставка/удаление игроков будет намного реже, чем поиск. –