哪种方法可以更好地管理Django应用程序中的照片数量?

时间:2015-08-10 19:32:38

标签: python django postgresql

我正在构建一个Django应用程序,其中包含允许用户上传照片和查看其他用户照片的功能。每张照片可以是所有用户都可以查看的公开照片,也可以是只有一组其他用户可以查看的私人照片。存储与照片相关的数字(即“指标”)的最佳方法是什么?通过将它们存储在Unix文件中或将它们存储在通过Django ArrayField类型访问的PostgreSQL数组字段中,我可以获得更好的性能和可伸缩性吗?这些标记只会在用户上传照片时写入,但当其他用户正在查看某人的照片时,这些照片会被频繁阅读。

以下是两个更详细的选项:

如果用户“smith”上传了两张公开照片和一张私人照片,他们将拥有以下名称:

smith_public_001.jpg
smith_public_002.jpg
smith_private_001.jpg

我可以将'001'和'002'存储在'public_indicies'文件中,将'001'存储在单独的'private_indicies'文件中:

smith
├── private
│   ├── private_indicies.txt
│   └── smith_private_001.jpg
└── public
    ├── public_indicies.txt
    ├── smith_public_001.jpg
    └── smith_public_002.jpg

或者,我可以像这样拥有一个'Indicies'Django类并将它们存储在那里:

class Indicies(models.Model):
  user = models.ForeignKey(User)
  pub_indicies = ArrayField(
    models.IntegerField(null=True, blank=True), 
    null=True)
  pvt_indicies = ArrayField(
    models.IntegerField(null=True, blank=True), 
    null=True)

“天真”的方法是将它们存储在文件中。直觉上这对我来说很有意义,因为文件读取和写入应该非常快,数据库最终只是读取和写入文件到磁盘,但使用数据库会增加数据库和Django ORM的额外开销。有人可能会说,将文件保存到文件中是不可扩展的,因为您将所有指标绑定到特定服务器但如果我有足够的用户照片我的静态照片媒体服务器受到重创,我可以创建多个照片服务器和在服务器上传播用户的照片和索引文件。

顺便说一句,我已经考虑过使用Django原始SQL查询,但构建查询字符串非常麻烦。我还可以将这些指标存储在像Redis这样的NoSQL数据库中,但其缺点是指标只能每分钟持续存储到磁盘一次。如果我的服务器崩溃,那么指示可能处于错误状态,这可能会搞砸我的索引管理代码。

我应该补充说,用户只能上传10张公开照片和10张私人照片。因此,用例是偶尔的小写和非常频繁的小读。

我错过了什么?在性能和可扩展性方面,这两种方法有哪些优点和缺点?还有其他更好的方法我还没有想过吗?

感谢。

1 个答案:

答案 0 :(得分:1)

读取/写入文件本质上是现代计算中最慢的东西。我不记得数字,但它比内存访问慢1000倍。

数据库管理系统会将所有内容存储在磁盘上,但在与之通信时,大多数情况下您都在与内存中的副本进行通信。驱动器的转储发生在后台。

因此,从性能角度以及从组织的角度来看,最好使用数据库。