ฉันมีตารางที่มีเค้าโครงนี้:
CREATE TABLE Favorites
(
FavoriteId uuid NOT NULL PRIMARY KEY,
UserId uuid NOT NULL,
RecipeId uuid NOT NULL,
MenuId uuid
)
ฉันต้องการสร้างข้อ จำกัด ที่ไม่ซ้ำแบบนี้:
ALTER TABLE Favorites
ADD CONSTRAINT Favorites_UniqueFavorite UNIQUE(UserId, MenuId, RecipeId);
แต่นี้จะช่วยให้หลายแถวด้วยเหมือนกันถ้า(UserId, RecipeId)
MenuId IS NULL
ผมต้องการที่จะช่วยให้NULL
ในMenuId
การจัดเก็บที่ชื่นชอบที่ไม่มีเมนูที่เกี่ยวข้อง แต่ฉันเพียงต้องการมากที่สุดคนหนึ่งของแถวเหล่านี้ต่อผู้ใช้ / คู่สูตร
ความคิดที่ฉันมีคือ:
ใช้ UUID ที่กำหนดค่าตายตัวบางอย่าง (เช่นศูนย์ทั้งหมด) แทนค่า Null
อย่างไรก็ตามMenuId
มีข้อ จำกัด FK ในเมนูของผู้ใช้แต่ละคนดังนั้นฉันต้องสร้างเมนู "null" พิเศษสำหรับผู้ใช้ทุกคนที่สร้างความยุ่งยากตรวจสอบการมีอยู่ของรายการ null โดยใช้ทริกเกอร์แทน
ฉันคิดว่านี่เป็นเรื่องยุ่งยากและฉันชอบหลีกเลี่ยงทริกเกอร์ทุกครั้งที่ทำได้ นอกจากนี้ฉันไม่ไว้วางใจพวกเขาเพื่อรับประกันว่าข้อมูลของฉันจะไม่อยู่ในสถานะที่ไม่ดีเพียงแค่ลืมมันและตรวจสอบการมีอยู่ของรายการ null ก่อนหน้านี้ในมิดเดิลแวร์หรือในฟังก์ชั่นแทรกและไม่มีข้อ จำกัด นี้
ฉันใช้ Postgres 9.0
มีวิธีใดบ้างที่ฉันมองเห็น?
UserId
,RecipeId
) ถ้าMenuId IS NULL
?