当我们在SQL数据库中有很多资源B时,如何建立 "资源A可以关联到所有资源B "的关系?[已关闭]

问题描述 投票:0回答:2

例如,使用案例

一个促销活动可以适用于所有渠道,也可以适用于少数渠道。

关系

多对多

问题

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

我的想法

如果我们没有太多的渠道,我们可以把每个渠道都加到他们的关系表中,如果我们有上千个渠道,这种情况下有什么最好的做法?

sql database-design software-design
2个回答
1
投票
-- 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. 你申请晋升 P7 到渠道 C3C5 插入 (C3, P7)(C5, P7) 变成 chn_pro.
  3. 然后你决定做推广 P7 通过插入 (P7) 变成 glob_pro现在它适用于所有渠道。
  4. 后来,如果你降级了,通过删去 (P7)glob_pro它只适用于 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

0
投票

你应该有一个 promotion_channels 表(我想你称之为 "关系",但这个名字很模糊),然后将任何匹配的渠道添加到表中。 对于一个影响所有渠道的促销活动,应该添加所有渠道。

为什么要这样做呢? 因为你可能会随着时间的推移增加渠道。 你不希望旧的促销活动适用于新的渠道。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.