В чем причина того, что у Django есть SmallIntegerField? - PullRequest
30 голосов
/ 04 октября 2009

Мне интересно, почему это предусмотрено. Поле зависит от базы данных, разве это не делает его совершенно ненадежным для использования?

Я хочу сохранить год рождения в модели, вроде

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

Конечно, это занимает очень мало места, оно всегда должно быть длиной 4 "символа", так что может пригодиться PositiveSmallIntegerField, но почему я должен выбирать его вместо обычного IntegerField?

Ответы [ 5 ]

31 голосов
/ 04 октября 2009

Производительность на многих RDBM может сильно зависеть от размера строки. В то время как «пуристический» подход мог бы сказать, что приложение должно быть полностью независимым от базовой структуры данных, улучшение многих строк, например использование меньшего целого числа, могло бы сократить гигабайты по размеру таблицы, что позволило бы большей части таблицы поместиться в памяти, что значительно улучшает спектакль. Это B рифовая часть Азбука .

Я бы использовал маленькое целое число, например, это, например, первичный ключ в таблице, который всегда будет иметь <100 строк, особенно если он хранится как внешний ключ в таблице, и я ожидаю, что он станет очень большим. Несмотря на то, что размер определяется реализацией, можно предположить, что он, по крайней мере, больше 127. </p>

13 голосов
/ 20 января 2010

Это не полностью ненадежно. SMALLINT является частью стандарта SQL, и, конечно, MySQL и PostgreSQL имеют целочисленные типы малого размера, которые варьируются от -32768 до + 32767

.
7 голосов
/ 04 октября 2009

Это одна из тех вещей, которые есть, потому что она так и появилась.

Django поддерживает SmallIntegerField, потому что Django вырос на PostgreSQL, а PostgreSQL поддерживает smallint. Документы PosgreSQL говорят

Тип smallint, как правило, используется только в том случае, если объем дискового пространства выше.

Хотя сейчас это кажется странным, когда в магазине на углу можно было найти диски объемом 1 ТБ, но это было не так давно, когда диски были намного меньше и стоили значительно больше на байт. Память тоже. Использование smallint (где это уместно) в индексе означает встраивание большего числа индексов строк в кэш-память RAM, что означает повышение производительности.

2 голосов
/ 04 октября 2009

Вы бы выбрали SmallIntegerField, если хотите сэкономить место в базе данных. Ограничение значения зависит от базы данных, но это не делает его ненадежным. Это просто означает, что вы должны знать, какую систему баз данных вы используете, и выяснить, какой предел для этой системы.

0 голосов
/ 14 сентября 2010

Год - это дата без учета месяцев и дней. Выберите DateField и, следовательно, наслаждайтесь всей мощью, которую дает вам Django. Так как вы храните рожденных лет, это также позволяет вам в будущем просто принимать месяцы и дни.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...