Postgresql

狀態欄位:ALTER TYPE 與 INSERT INTO?

  • June 2, 2018

我有一個帶有狀態列的簡單表:

create type status as enum (
 'approved',
 'pending_approval',
 'rejected'
);

create table document (
 id          serial primary key,
 uuid        uuid unique not null default uuid_generate_v4(),
 title       text not null,
 content     text,
 status      status not null,
 created_at  timestamptz not null default now(),
 updated_at  timestamptz not null default now(),
 deleted_at  timestamptz
);

這是我正在做的一個小型工作流式應用程序的開始。然而,狀態可以由應用程序的使用者定義。使用 ALTER TYPE 而不是創建新表並使用 JOIN 有什麼缺點?我真的不想僅僅因為狀態欄位而在我的查詢中添加 JOIN。

使用 ALTER TYPE 而不是創建新表並使用 JOIN 有什麼缺點?我真的不想僅僅因為狀態欄位而在我的查詢中添加 JOIN。

這是您典型的讚成/反對列舉與標準化問題。

ENUM類型

  • 如果範圍是固定的或只需要 DBA 修改,那就太好了。
  • 獲得一個非常好的查詢語法,優化得很好(底部假設狀態是一個列舉)
SELECT * FROM foo WHERE status = 'INVALID';
  • 分類良好,並允許在類型內輕鬆範圍。所有列舉都已排序並具有序數
  • 以 4 字節大小儲存
  • 可以消除一個JOIN
  • PostgreSQL 有 ENUM 類型,而不是宏(如 MySQL)。這意味著您不會在維護中受到打擊。如果您有五個表使用您的ENUM類型,您仍然可以只管理一種類型而不是五個表。

正規化/JOIN方法

  • 如果使用者需要能夠修改域/數據,則始終首選
  • 如果域/數據需要縮小(刪除值),則始終首選
  • 將使用 ORM 提供更輕鬆的修改
  • 更傳統
  • 可以小於ENUM(例如smallint兩個字節,enum總是四個字節)。

引用自:https://dba.stackexchange.com/questions/205505