Django有SmallIntegerField的原因是什么?

odi*_*ont 30 django django-models

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

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

class Person(models.Model):
  name = models.CharField(max_length=256)
  born = models.IntegerField()
Run Code Online (Sandbox Code Playgroud)

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

Tod*_*ner 33

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

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

  • 当您拥有固定数量的选项并使用choices参数时,SmallIntegerField也很方便.例如:born = models.SmallIntegerField(choices =((1,'1960-1969'),2,'1970 - 1970)) (10认同)
  • 不幸的是,与ABC优化帖子的链接现在已失效。我已经尝试过,但是找不到类似的参考资料;我从未听说过,对此很感兴趣。有人有更多信息吗? (3认同)

Ane*_*pic 13

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


Dav*_*ith 7

这是其中之一就是它的方式,因为它有这样的方式.

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

smallint类型通常仅在磁盘空间非常宝贵时使用.

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

  • 我还要补充一点,使用 `SmallIntegerField` 会_稍微_减少打字错误的机会。如果您知道整数的值将低于 32,768 或高于 -32,767,您将无法意外地保存更大或更小的整数。 (2认同)