Mit_tt
@Mit_tt

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

PostgreSQLのenum型とcheck制約の違い

解決したいこと

自分の給料データベースを作成しようとしています。
データベースはPostgreSQLです。

給料日テーブルを作成するSQLをchatGPTでレビューを貰いました。
その際、payment_typeはenum型にすることでデータの整合性をより確保できると指摘されました。

check制約でも「給与」と「賞与」以外は挿入できないと思うのですが、わざわざenum型にする理由はなぜでしょうか。

今後、payment_typeに項目を追加することはありません。
また、登録したデータはpgAdmin4でしか見るとこはありません。(アプリなどを作りません)

よろしくお願いいたします。

給料日テーブル

--給料日
CREATE TABLE payday(
    id SERIAL PRIMARY KEY,
    payment_date DATE UNIQUE NOT NULL,--給与支給日
    payment_type VARCHAR(2) NOT NULL CHECK payment_type IN ('給与','賞与')--タイプ(給与または賞与)
);
0

3Answer

check制約でも「給与」と「賞与」以外は挿入できないと思うのですが、わざわざenum型にする理由はなぜでしょうか。

Chat GPT に聞いてみましたか? 何と言っていたでしょう?

「データの整合性」と言っているということは、質問に書いてない他の部分との整合性とかの話かと想像してますが、違いますか?

1Like

型にすれば複数列で共用できるので,変更漏れが起きず整合性は確保できると思いますが、そうでなければ整合性に違いはないと思います。
enumは内部で4バイトで管理されるため、ストレージの格納効率が宜しいです。
一方でデメリットもあります。
こちらのブログが参考になります。
https://notso.boringsql.com/posts/postgresql-enums/

1Like

1.どうせ給与、賞与以外に挿入できないと言うのであれば、checkに比べて保存領域上の利点があり、強力に型チェックを行うenumを使わない理由はありません。
2.ddlの修正をすることはないとおっしゃったので、enumの弱点である追加や修正が難しいという点はありません。
3. 将来的に他のテーブルでenumに宣言された給与、賞与を使用することがあれば、使用可能という点で拡張性が追加的にあると考えられます。

  • gptが回答した答えについては、データの整合性に差はありません。もちろんenumがdbに制約条件をかけるため、少し強い制約条件ですが、原理が違うだけで結果は変わらないと言っても差し支えありません。

  • gptは断片的にしか知りませんし、最終的には人が決定しなければなりません。 長所だけ、短所だけというものはなく、すべてトレードオフです。

  • 私の答えも間違っているかもしれません。

  • 私は韓国人なので翻訳機を使いました。文脈が変かもしれません。

1Like

Your answer might help someone💌