web-dev-qa-db-ja.com

DjangoにSmallIntegerFieldがある理由は何ですか?

なぜ提供されているのだろうか。このフィールドはデータベースに依存しますが、それによって使用の信頼性が完全に低下しませんか?

誕生年をモデルに保存したい

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

もちろん、これには必要なスペースはごくわずかで、常に4「文字」の長さである必要があるため、PositiveSmallIntegerFieldが収まる可能性がありますが、通常のIntegerFieldの代わりに選択する必要があるのはなぜですか。

30

多くのRDBMのパフォーマンスは、行サイズに大きく依存する可能性があります。 「純粋主義」のアプローチでは、アプリケーションは基盤となるデータ構造から完全に独立している必要があると言えますが、小さい整数を使用するなどの多くの行の改善により、テーブルサイズがギガバイト削減され、より多くのテーブルがメモリに収まり、大幅に改善されます。パフォーマンス。これは、 ABC[〜#〜] b [〜#〜]の短い部分です。

たとえば、このような小さな整数を使用します。たとえば、テーブルの主キーは常に100行未満であり、特にこれが非常に大きくなると予想されるテーブルに外部キーとして格納されている場合はそうです。サイズは実装で定義されていますが、少なくとも127より大きいと想定しても問題ありません。

33
Todd Gardner

それは完全に信頼できないわけではありません。 SMALLINTはSQL標準の一部であり、確かにMySQLとPostgreSQLはどちらも-32768から+32767までの小さな整数型を持っています

13
Anentropic

これは、そのようになったための方法の1つです。

DjangoはPostgreSQLで育ち、PostgreSQLはsmallintをサポートしているため、DjangoはSmallIntegerFieldをサポートしています。PosgreSQLのドキュメントによると

Smallintタイプは通常、ディスク容量が限られている場合にのみ使用されます。

今ではちょっと古風な感じがしますが、1TBのディスクを角の店に置くことができるとき、ディスクがはるかに小さく、バイトあたりのコストが大幅に高くなったのはそれほど昔のことではありませんでした。記憶も。インデックスでsmallint(適切な場合)を使用することは、より多くの行インデックスをRAMキャッシュに適合させることを意味し、パフォーマンスが向上することを意味します。

7
Dave W. Smith

データベースのスペースを節約したい場合は、SmallIntegerFieldを選択します。値の制限はデータベースに依存しますが、それによって信頼性が低下することはありません。これは、使用しているデータベースシステムを把握し、そのシステムの制限を確認する必要があることを意味します。

2
Ned Batchelder