我很奇怪为什么提供它。该字段依赖于数据库,是否使其完全不可靠?
我想将出生年份存储在模型中,有点像
class Person(models.Model):
name = models.CharField(max_length=256)
born = models.IntegerField()
当然这需要很小的空间,它应该总是4“字符”长,所以一个PositiveSmallIntegerField可能适合,但为什么我应该选择它而不是正常的IntegerField?
答案 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为您提供的所有力量。由于您存储了生日,这也使您在将来可以接受数月和数天。