Questa è probabilmente la mia seconda volta postata nei programmatori. Di solito sono su stackoverflow ma questa domanda è più adatta per la community qui.
Tutti i suggerimenti, i consigli e le opinioni su questo argomento sono estremamente apprezzati. Ti chiedo anche la tua brutale onestà. Se pensi che quello che sto facendo in termini di design è davvero stupido, RACCONTA! perché sono un software engineer back-end autodidatta e posso usare tutti i consigli che posso ottenere.
Uso Django, Redis e amp; PostgreSQL. Diciamo per esempio che ho un utente, post e amp; Modello di posizione.
#models.py
from django.db import models
from django.contrib.auth.models import User
class Post(models.Model):
user = models.ForeignKey(User)
media_url = models.CharField(max_length=255, blank=True)
related_location = models.ForeignKey('Location')
class Location(models.Model):
name = models.CharField(max_length=200, blank=True)
address = models.CharField(max_length=255, blank=True)
city = models.CharField(max_length=140, blank=True)
Grande, ora che è fuori strada, diciamo che gli utenti volevano vedere tutti i post taggati in una certa posizione. Questa posizione ha un ID di 1812. Il modo normale per farlo è quello di creare una query semplice e restituire post in cui related_location ha un ID di 1812. Devo impaginare i risultati in modo che l'utente veda 10 oggetti alla volta. Se vogliono vedere di più, devono fare un'altra richiesta.
In passato facevo cose così, fino a poco tempo fa avevo la paura che i database diventassero potenzialmente grandi e le query diventassero molto lente. Così ho deciso di creare indici su Redis per ogni oggetto Location. Ad esempio, supponiamo che i post 7, 33, 18, 12, 89, 56500, 34000, 30 vengano tutti taggati nella posizione 1812. Creerei un elenco Redis chiamato "posizione: 1812" e in tale elenco, conterrebbe gli ID di tutti i post in cui siamo taggati lì, in questo caso redislist = [7, 33, 18, 12, 89, 56500, 34000, 30].
Vorrei quindi prendere questo elenco e interrogarlo in proposito:
queryset = Post.objects.filter(pk__in = redislist).order_by('-pk')
È una cosa intelligente da fare? Immediatamente ho iniziato a pensare ai pro e ai contro dell'approccio. Per uno, le query al DB sarebbero più veloci poiché so già quali oggetti devo catturare. Tuttavia, in termini di design, ne vale la pena? Per qualcosa come oggetti di posizione unici, quella tabella in postgres da sola può crescere infinitamente grande (può avere più di un miliardo di righe). Memorizzare un elenco per ciascun oggetto posizione in Redis può essere costoso (memoria esaurita).
Quindi tutto si riduce a questo. Il DB è abbastanza buono, o dovrei continuare a fare quello che sto facendo?