Django有SmallIntegerField的原因是什么?

时间:2009-10-04 14:55:30

标签: django django-models

我很奇怪为什么提供它。该字段依赖于数据库,是否使其完全不可靠?

我想将出生年份存储在模型中,有点像

class Person(models.Model):
  name = models.CharField(max_length=256)
  born = models.IntegerField()

当然这需要很小的空间,它应该总是4“字符”长,所以一个PositiveSmallIntegerField可能适合,但为什么我应该选择它而不是正常的IntegerField?

5 个答案:

答案 0 :(得分:30)

许多RDBM的性能可能在很大程度上取决于行的大小。虽然“纯粹主义”方法可能会说应用程序应该完全独立于底层数据结构,但是在许多行上的改进(如使用较小的整数)可以减少表大小的千兆字节,这使得更多的表适合内存,这大大改善了性能。它是ABCs B rief部分。

我会使用像这样的小整数,例如,表上的主键总是具有<100行,特别是当它作为外键存储在表中时我希望变得非常大。虽然大小是实现定义的,但可以安全地假设它至少大于127。

答案 1 :(得分:13)

不完全不可靠。 SMALLINT是SQL标准的一部分,当然MySQL和PostgreSQL都有从-32768到+32767的小整数类型

答案 2 :(得分:7)

这就是其中之一,因为它就是这样。

Django支持SmallIntegerField,因为Django在PostgreSQL上长大,而PostgreSQL支持smallint。 PosgreSQL文档说

  

通常仅在磁盘空间非常宝贵的情况下才使用smallint类型。

虽然现在看起来有点古怪,但是当角落商店可以使用1TB磁盘时,不久以前磁盘数量要小很多,每个字节的成本要高得多。记忆也是。在索引中使用smallint(适当时)意味着将更多行索引装入RAM缓存,这意味着更好的性能。

答案 3 :(得分:2)

如果要在数据库中节省空间,可以选择SmallIntegerField。值的限制取决于数据库,但这并不会使其不可靠。它只是意味着您必须知道您正在使用的数据库系统,并找出该系统的限制。

答案 4 :(得分:-3)

日期,无需照顾月和日。选择DateField,因此享受Django为您提供的所有力量。由于您存储了生日,这也使您在将来可以接受数月和数天。