当我们在 SQL 数据库中有很多资源 B 时,如何对“资源 A 可以关联到所有资源 B” 的关系建模?

How to model the relation `Resource A can be associated to all resource B` when we have lots of resource B in SQL database?

用例,例如

促销可以应用于所有渠道,也可以应用于几个渠道,

关系

多对多

问题

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

我的想法

如果我们没有太多频道,我们可以将每个频道添加到它们的关系中 table,如果我们有数千个频道怎么办,处理这种情况的最佳做法是什么?

您应该有一个 promotion_channels table(我认为您正在调用 "relations",但该名称含糊不清)并将任何匹配的频道添加到 table。对于影响所有渠道的促销,应添加所有渠道。

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

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

但是,因为渠道可能会随着时间而改变,我不推荐这种方法。

-- 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}

促销可能只适用于少数人 channels,后来那个promotion声明为global,就OK了。
例如:

  1. 假设您有 10 个促销活动 {P1 .. P10} 和 100 个频道 {C1..C100}
  2. 您通过将 (C3, P7)(C5, P7) 插入 chn_pro 来将促销 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