一个促销活动可以适用于所有渠道,也可以适用于少数渠道。
多对多
如何建立关系模型 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}
可能有这样的情况,一个促销活动只适用于几个渠道,后来这个促销活动被宣布为全局性的,这也是可以的。比如说
{P1 .. P10}
和100个频道 {C1..C100}
.P7
到渠道 C3
和 C5
插入 (C3, P7)
和 (C5, P7)
变成 chn_pro
.P7
通过插入 (P7)
变成 glob_pro
现在它适用于所有渠道。(P7)
从 glob_pro
它只适用于 C3
和 C5
再次。为了列出所有频道的所有促销活动,请使用视图。
-- 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
表(我想你称之为 "关系",但这个名字很模糊),然后将任何匹配的渠道添加到表中。 对于一个影响所有渠道的促销活动,应该添加所有渠道。
为什么要这样做呢? 因为你可能会随着时间的推移增加渠道。 你不希望旧的促销活动适用于新的渠道。
当然,你也可以有一个 "特殊 "的频道,这意味着所有的频道--也许有一个 channel_id
的 0
. 那么任何寻找通道的代码都可以考虑到这一点。 这有点复杂,而且容易出错,但大部分可以隐藏在视图和其他构造中。
但是,因为渠道可能会随着时间的推移而改变,我不推荐这种方法。