PostgreSQLでしない方がいいことリスト
Don't Do This - PostgreSQL wiki をちまちま翻訳
BETWEEN
を使わない方がいい (TIMESTAMP
では特に)
使わない方がいい理由
BETWEEN
は閉区間比較です。
つまり、指定された範囲の両端の値が結果に含まれます
これは、次のような形式のクエリで特に問題となります。
SELECT * FROM blah WHERE timestampcol BETWEEN '2018-06-01' AND '2018-06-08'
このクエリには、タイムスタンプが正確に2018-06-08 00:00:00.000000
である結果が含まれますが、同じ日のそれ以降のタイムスタンプは含まれません。
したがって、クエリは機能しているように見えるかもしれませんが、12時ちょうどにエントリを取得するとすぐに、それを二重にカウントしてしまいます
その代わりに、次のようにします。
SELECT * FROM blah WHERE timestampcol >= '2018-06-01' AND timestampcol < '2018-06-08'
使ってもいい場合
BETWEEN
は、範囲の両端が結果に含まれることを覚えている限り、整数や日付のような離散量には安全です。しかし、普段から使わない方がいいでしょう。
serial
型を使わない方がいい
新規にアプリを作るなら、代わりにIDENTIDY列を使ってください
create table items {
id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY
}
使わない方がいい理由
serial
型には、スキーマ、依存関係、パーミッション管理を不必要に煩雑にする奇妙な振る舞いをすることがあるからです
それでも使うべきとき
- バージョン10より古いPostgreSQLのサポートが必要な場合
- テーブル継承と組み合わせる場合(そもそも、テーブル継承は使わない方がいい)
- 複数のテーブルから同じシーケンスを何らかの形で使用する場合。(そのような場合は
serial
型よりも明示的な宣言の方が望ましい)
デフォルトでvarchar(n)を使用しない
デフォルトでvarchar(n)型を使用しないでください。代わりにvarchar(長さ制限なし)
またはtext
を考慮してください。
なぜ使わない方がいいか
varchar(n)は可変幅のテキストフィールドで、n文字(バイトではない)以上の文字列を挿入しようとするとエラーになります。
varchar(長さ制限なし)やtextも同様ですが、長さの制限はありません。3つのフィールドタイプに同じ文字列を挿入した場合、まったく同じ量のスペースを使用することになり、パフォーマンスの違いを測定することはできません。
もし本当に必要なのが長さ制限のあるテキストフィールドであれば、varchar(n)は素晴らしいものですが、もし任意の長さを選択して名字フィールドにvarchar(20)を選択した場合、将来Hubert Blaine Wolfeschlegelsteinhausenbergerdorffさんがあなたのサービスに登録したときに、プロダクションエラーが発生する危険性があります。
データベースの中には、任意の長さのテキストを格納できる型がないものや、あったとしてもvarchar(n)ほど便利ではなく、効率的でもなく、サポートも充実していないものがあります。
そのようなデータベースのユーザーは、本当に必要なのはテキストなのに、varchar(255)のようなものを使うことがよくあります。
フィールドの値を制約する必要がある場合、最大長よりももっと具体的なものが必要でしょう。最小長や限られた文字数などが考えられますが、チェック制約は最大文字列長と同様にこれらすべてを行うことができます。
どんなときに使うの?
本当に必要なときです。長すぎる文字列を挿入するとエラーになるテキストフィールドが必要で、明示的なチェック制約を使用したくない場合、varchar(n)は完全に良い型です。ただ、何も考えずに自動的に使用しないでください。
また、varchar型はtext型と違って標準SQLに入っているので、超ポータブルなアプリケーションを書くには最適な選択かもしれません。