当我们在 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_id
为 0
。然后任何寻找频道的代码都可以考虑到这一点。这有点复杂且容易出错,但其中大部分可能隐藏在视图和其他构造中。
但是,因为渠道可能会随着时间而改变,我不推荐这种方法。
-- 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了。
例如:
- 假设您有 10 个促销活动
{P1 .. P10}
和 100 个频道 {C1..C100}
。
- 您通过将
(C3, P7)
和 (C5, P7)
插入 chn_pro
来将促销 P7
应用于频道 C3
和 C5
。
- 然后您决定通过将
(P7)
插入 glob_pro
来使推广 P7
全局化,现在它适用于所有渠道。
- 稍后,如果您通过从
glob_pro
中删除 (P7)
来降级促销,它仅适用于 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
用例,例如
促销可以应用于所有渠道,也可以应用于几个渠道,
关系
多对多
问题
如何对关系建模 A promotion can be applied to all channels
?
我的想法
如果我们没有太多频道,我们可以将每个频道添加到它们的关系中 table,如果我们有数千个频道怎么办,处理这种情况的最佳做法是什么?
您应该有一个 promotion_channels
table(我认为您正在调用 "relations",但该名称含糊不清)并将任何匹配的频道添加到 table。对于影响所有渠道的促销,应添加所有渠道。
为什么?因为您可能会随着时间的推移添加频道。您不希望旧的促销活动应用于新频道。
当然,您也可以有一个 "special" 频道,这意味着所有频道 -- 也许 channel_id
为 0
。然后任何寻找频道的代码都可以考虑到这一点。这有点复杂且容易出错,但其中大部分可能隐藏在视图和其他构造中。
但是,因为渠道可能会随着时间而改变,我不推荐这种方法。
-- 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了。
例如:
- 假设您有 10 个促销活动
{P1 .. P10}
和 100 个频道{C1..C100}
。 - 您通过将
(C3, P7)
和(C5, P7)
插入chn_pro
来将促销P7
应用于频道C3
和C5
。 - 然后您决定通过将
(P7)
插入glob_pro
来使推广P7
全局化,现在它适用于所有渠道。 - 稍后,如果您通过从
glob_pro
中删除(P7)
来降级促销,它仅适用于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