首页 > 解决方案 > 使用链接表来限制多对多关系中的实体,否则没有限制

问题描述

我在 PromoCode 和 User 之间有多对多的关系。一个用户可以有许多促销代码,一个促销代码可以对许多用户有效。默认情况是促销代码对所有用户都有效。

用户(用户 ID,...)

促销代码(促销代码 ID,...)

在这种多对多关系中,我创建了一个辅助表 UserPromoCode(userId, promoCodeId),我们在其中仅存储对少数客户限制的促销代码。我该如何处理默认情况?

我是否必须在 UserPromoCode 表中为所有用户添加记录?创建新的促销代码时显然会很昂贵或者我是否必须只保存受限的促销代码并在我的应用程序逻辑中应用 if else 条件,例如如果 UserPromoCode 表中没有促销代码的记录,促销代码适用于所有人?

简而言之,我们如何处理可选限制某个实体对其他实体的问题,否则默认情况下在多对多关系中没有限制?

我不想在应用程序逻辑中应用 if else 条件。我只是想应用一个查询,它可以为我提供用户的所有促销代码(受限制或不受限制的)

标签: databasehibernatejpadatabase-designmany-to-many

解决方案


-- Promo code CDE exists.
--
promo {CDE}
   PK {CDE}
-- Promo code CDE is special (restricted).
--
promo_special {CDE}
           PK {CDE}

FK {CDE} REFERENCES promo {CDE}
-- Promo code CDE is available to all users.
--
CREATE VIEW promo_all
AS
SELECT CDE from promo
EXCEPT
SELECT CDE from promo_special ;
-- User USR exists.
--
user_ {USR}
   PK {USR}

选项1

一部分(特殊)用户有资格获得所有特殊促销代码。

-- User USR qualifies for all special promo codes.
--
user_special {USR}
          PK {USR}

FK {USR} REFERENCES user_ {USR}
-- User USR qualifies for promo code CDE.
--
CREATE VIEW user_promo
AS

SELECT USR, CDE
FROM       user_
CROSS JOIN promo_all

UNION

SELECT USR, CDE
FROM       user_special
CROSS JOIN promo_special ;

选项 2

一些用户有资格获得一些特殊的促销代码。

-- User USR qualifies for special promo code CDE.
--
user_special {USR, CDE}
          PK {USR, CDE}

FK1 {USR} REFERENCES user_ {USR}

          FK2 {CDE} REFERENCES
promo_special {CDE}
-- User USR qualifies for promo code CDE.
--
CREATE VIEW user_promo
AS

SELECT USR, CDE
FROM       user_
CROSS JOIN promo_all

UNION

SELECT USR, CDE
FROM user_special ;

两种选择

获取特定用户的所有促销代码。

-- Specific user (USR = specific_user) qualifies
-- for promo code CDE.
--
SELECT CDE FROM user_promo WHERE USR = specific_user ;

笔记:

All attributes (columns) NOT NULL

PK = Primary Key
FK = Foreign Key

推荐阅读