Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';Django有SmallIntegerField的原因是什么?_Django_Django Models - Fatal编程技术网

什么';Django有SmallIntegerField的原因是什么?

什么';Django有SmallIntegerField的原因是什么?,django,django-models,Django,Django Models,我不知道为什么会提供。该字段依赖于数据库,这难道不意味着它的使用完全不可靠吗 我想在模型中存储出生年份,有点像 class Person(models.Model): name = models.CharField(max_length=256) born = models.IntegerField() 当然,这需要很少的空间,它应该始终是4个“字符”长,因此可能适合正整数字段,但是为什么我要选择它而不是普通整数字段呢?如果希望在数据库中节省空间,您可以选择小整数字段。该值的限制取决于

我不知道为什么会提供。该字段依赖于数据库,这难道不意味着它的使用完全不可靠吗

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

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

当然,这需要很少的空间,它应该始终是4个“字符”长,因此可能适合正整数字段,但是为什么我要选择它而不是普通整数字段呢?

如果希望在数据库中节省空间,您可以选择小整数字段。该值的限制取决于数据库,但这并不意味着它不可靠。这只是意味着你必须知道你使用的是什么数据库系统,并找出该系统的限制。

这是其中一种方式,因为它是这样的

Django支持SmallIntegerField,因为Django是在PostgreSQL上长大的,而PostgreSQL支持smallint。PosgreSQL医生说

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


虽然现在看起来有点奇怪,当1TB的磁盘可以在街角商店买到时,但不久以前磁盘小了很多,每字节的成本明显增加。记忆也是。在索引中使用smallint(在适当的情况下)意味着将更多的行索引放入RAM缓存,这意味着更好的性能。

许多RDBMs上的性能在很大程度上取决于行大小。虽然“纯粹主义”的方法可能会说应用程序应该完全独立于底层数据结构,但在许多行上进行改进(如使用较小的整数)可以减少表大小的千兆字节,从而使更多的表适合内存,从而显著提高性能。这是该系统的Brief部分


我会使用一个像这样的小整数,比如说,一个表上的主键,它总是有它不是完全不可靠的。SMALLINT是SQL标准的一部分,当然MySQL和PostgreSQL都有从-32768到+32767的小整数类型

年是日期,不考虑月和日。选择,享受Django为您提供的所有力量。由于您存储出生年份,这也允许您在将来只接受月份和天数。

SmallIntegerField在您有固定数量的选项并使用choices参数时也很方便。例如:born=models.SmallIntegerField(choices=((1,'1960-1969'),2,'1970-1970))我不知道,我永远不会在主键上使用小整数字段。如果您的ID自动递增,并且行被删除和添加,那么只需要一个可笑的人在几年内重新创建足够多的行就可以引起问题。ID是唯一一个我认为不适合这种优化的东西。不幸的是,ABCs优化帖子的链接现在已经死了。我试过了,但找不到类似的参考资料;我从没听说过,我很感兴趣。有人有更多的信息吗?好吧,如果你不能指望切换后端数据库来不破坏东西的话,那就让它变得不可靠吧?我不认为这是不可靠的。这就是便携性。作为工程师,我们必须分析问题和工具,然后以解决问题的方式组合这些工具。如果您的问题允许您只使用支持SmallIntegerField的数据库,并且数据库中的空间是一个潜在的问题,那么SmallIntegerField是一个很好的解决方案,没有不可靠性。因为我不想要日期,我想要一年。这与日期字段不太合适。@Velmont:我认为年就是日期。不,日期也有月和日。我不这么做,因为很难将日期对象用作年。这也是错误的。因为我实际上必须在上面写上日期和月份(因为没有它是不可能的),所以这是100%错误的。一开始我是从DateTime开始的,但后来发现这不是一个明智的举动。@Gabor:你说得有一部分是对的,一个日期可能就是一个部分日期。但就像在几乎所有系统中一样,日期被假定为有一个月和一天,并且不能只设置年份,因此它不能是部分的。由于不支持部分日期,将其存储为整数是一种非常好的方法。。。(类似地,您将年龄存储为整数,而不是时间跨度)4个字符的年份?Y10K问题?如果我写的东西真的能活到10000年……我还要补充一点,使用
SmallIntegerField
会稍微减少打字错误的几率。如果您知道整数的值将低于32768或高于-32767,您将无法意外地保存较大或较小的整数。