当SQL数据库中有大量资源B时,如何建模"资源A可以与所有资源B关联"的关系



用例,例如

促销可以应用于所有渠道,也可以应用于少数渠道,

关系

多对多

问题

如何对关系A promotion can be applied to all channels建模?

我的想法

如果我们没有太多的通道,我们可以将每个通道添加到它们的关系表中,如果我们有数千个通道,处理这种情况的最佳实践是什么?

-- channel CHN exists.
--
channel {CHN}
PK {CHN}
-- Promotion PRO exists.
--
promotion {PRO}
PK {PRO}
-- Promotion PRO is a global promotion.
-- (applied to all channels)
--
glob_pro {PRO}
PK {PRO}
FK {PRO} REFERENCES promotion {PRO}
-- Promotion PRO applies to channel CHN.
--
chn_pro {CHN, PRO}
PK {CHN, PRO}
FK1 {CHN} REFERENCES channel   {CHN}
FK2 {PRO} REFERENCES promotion {PRO}

晋升可能只适用于少数人渠道,然后该推广被宣布为全局,这是可以的。
例如:

  1. 假设您有十个促销{P1 .. P10}和100个频道{C1..C100}
  2. 通过在chn_pro中插入(C3, P7)(C5, P7),可以将升级P7应用于通道C3C5
  3. 然后,您决定通过将(P7)插入glob_pro来使促销P7全局化,现在它适用于所有渠道
  4. 稍后,如果通过从glob_pro中删除(P7)来降级升级,则它仅适用于C3C5

要列出所有频道的所有促销活动,请使用视图。

-- Promotion PRO applies to channel CHN.
--
CREATE VIEW all_channel_promotions
AS
SELECT CHN, PRO FROM chn_pro
UNION
SELECT CHN, PRO
FROM channel
JOIN glob_pro on True ;

注:

All attributes (columns) NOT NULL
PK = Primary Key
FK = Foreign Key

您应该有一个promotion_channels表(我认为您称之为"relationship",但这个名称很模糊(,并将任何匹配的通道添加到表中。对于影响所有渠道的促销,应添加所有渠道。

为什么?因为随着时间的推移,您可能会添加频道。您不希望旧的促销活动应用于新的渠道。

当然,你也可以有一个"特殊"通道,这意味着所有通道——也许channel_id0。然后,任何寻找通道的代码都可以考虑到这一点。这有点复杂,容易出错,但其中大部分可能隐藏在视图和其他构造中。

但是,由于渠道可能会随着时间的推移而变化,我不建议采用这种方法。

最新更新