非常感谢所有关于此事的建议,建议和见解。我要求你也是残酷的诚实。如果你认为我目前在设计方面所做的事情真是愚蠢,请告诉我!因为我是一名自学成才的后端软件工程师,我可以使用我能得到的所有建议。
我使用Django,Redis& PostgreSQL的。比方说,我有一个User,Post&位置模型。
#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)
很好,现在已经不在了,让我们说用户希望看到在某个位置标记的所有帖子。此位置的ID为1812.执行此操作的常规方法是进行简单查询并返回related_location的ID为1812的帖子。我将对结果进行分页,以便用户一次可以看到10个对象。如果他们想看到更多,他们需要再提出请求。
我曾经以这种方式做事,直到最近我才惊慌失措,数据库变得越来越大,查询变得非常慢。所以我决定在Redis上为每个Location对象创建索引。例如,让我们说帖子7,33,18,12,89,56500,34000,30我们都被标记在1812位置。我会创建一个名为“location:1812”的Redis列表,在该列表中,它将包含我们在那里标记的所有帖子的ID,在这种情况下它将:redis_list = [7,33,18,12,89,56500,34000,30]。然后我会把这个列表和查询对话:
queryset = Post.objects.filter(pk__in = redis_list).order_by('-pk')
这是一件聪明的事吗?我立刻开始思考这种方法的优缺点。首先,对DB的查询会更快,因为我已经知道需要抓取哪些对象。但是,在设计方面,值得吗?对于像独特位置对象这样的东西,仅在postgres中的那个表就可以变得无限大(超过十亿个唯一行)。在Redis中为每个位置对象存储唯一列表可能成本很高(内存耗尽)。
所以这一切都归结于此。 DB是否足够好,还是应该继续做我正在做的事情?