Saya punya tabel dengan tata letak ini:
CREATE TABLE Favorites
(
FavoriteId uuid NOT NULL PRIMARY KEY,
UserId uuid NOT NULL,
RecipeId uuid NOT NULL,
MenuId uuid
)
Saya ingin membuat batasan unik yang serupa dengan ini:
ALTER TABLE Favorites
ADD CONSTRAINT Favorites_UniqueFavorite UNIQUE(UserId, MenuId, RecipeId);
Namun, ini akan memungkinkan beberapa baris dengan yang sama (UserId, RecipeId)
, jika MenuId IS NULL
. Saya ingin mengizinkan NULL
dalam MenuId
untuk menyimpan favorit yang tidak ada menu terkait, tapi aku hanya ingin paling banyak satu baris ini per pasang user / resep.
Ide-ide yang saya miliki sejauh ini adalah:
Gunakan beberapa UUID hard-coded (seperti semua nol) bukan nol.
Namun,MenuId
memiliki batasan FK pada menu masing-masing pengguna, jadi saya kemudian harus membuat menu "null" khusus untuk setiap pengguna yang merepotkan.Periksa keberadaan entri nol menggunakan pemicu sebagai gantinya.
Saya pikir ini merepotkan dan saya suka menghindari pemicu sedapat mungkin. Plus, saya tidak percaya mereka untuk menjamin data saya tidak pernah dalam keadaan buruk.Lupakan saja dan periksa keberadaan entri nol sebelumnya di middle-ware atau fungsi insert, dan tidak memiliki kendala ini.
Saya menggunakan Postgres 9.0.
Apakah ada metode yang saya abaikan?
UserId
,RecipeId
), jikaMenuId IS NULL
?