Postgresql
狀態欄位:ALTER TYPE 與 INSERT INTO?
我有一個帶有狀態列的簡單表:
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
總是四個字節)。