database - 使用链接表来限制多对多关系中的实体,否则没有限制
问题描述
我在 PromoCode 和 User 之间有多对多的关系。一个用户可以有许多促销代码,一个促销代码可以对许多用户有效。默认情况是促销代码对所有用户都有效。
用户(用户 ID,...)
促销代码(促销代码 ID,...)
在这种多对多关系中,我创建了一个辅助表 UserPromoCode(userId, promoCodeId),我们在其中仅存储对少数客户限制的促销代码。我该如何处理默认情况?
我是否必须在 UserPromoCode 表中为所有用户添加记录?创建新的促销代码时显然会很昂贵或者我是否必须只保存受限的促销代码并在我的应用程序逻辑中应用 if else 条件,例如如果 UserPromoCode 表中没有促销代码的记录,促销代码适用于所有人?
简而言之,我们如何处理可选限制某个实体对其他实体的问题,否则默认情况下在多对多关系中没有限制?
我不想在应用程序逻辑中应用 if else 条件。我只是想应用一个查询,它可以为我提供用户的所有促销代码(受限制或不受限制的)
解决方案
-- 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
推荐阅读
- parallel-processing - 在 Dask 上,调用稀疏迭代方法 Dask Array 或跨集群中的节点
- android - Android:在模拟器中的 SharedPreferences.Editor.Commit 上偶尔出现 StackOverflowError
- powershell - 如何使用powershell使windows窗体的背景颜色可以交替变化?
- json - pandas Python - 如何从 JSON 文件中获取 Excel 中的正确格式
- uml - {readonly} \ {query} 在 UML 中是什么意思?
- javascript - 无法从本地存储中获取要显示的所有信息
- c++ - 如何在 C++ 中获取当前文件路径?
- swift - 滑块只增加图像视图大小而不是减小大小
- powershell - 使用 powershell 脚本访问 Outlook 邮件
- php - 当结果为 9 时处理未定义的偏移错误