我有一个(简化的)数据库模式,它代表card和。单个可以在多个. 一个有效的对被称为 a 。card_setscard_printscardcard_sets(card, card_set)card_print
我还需要建模关系card_have和card_want.
card_have必须能够表达“我有这张来自特定系列的卡片” 。
card_want必须能够表达以下两种情况:
- “我想要这张卡,我不在乎它来自哪个系列。”
- “我想要这张卡;我只想要它来自系列”。(或者,考虑这个更简单的变体:“我想要这张卡;我只希望它来自这个系列”。)
card_want归结为代表 的可能的card_prints子集card。
这是我到目前为止所拥有的(有点简化):
CREATE TABLE IF NOT EXISTS "card"
( id BIGSERIAL NOT NULL UNIQUE PRIMARY KEY
, name TEXT NOT NULL UNIQUE
);
CREATE TABLE IF NOT EXISTS "card_set"
( id BIGSERIAL NOT NULL UNIQUE PRIMARY KEY
, name TEXT NOT NULL UNIQUE
);
CREATE TABLE IF NOT EXISTS "card_print"
( id BIGSERIAL NOT NULL UNIQUE PRIMARY KEY
, card_id BIGINT NOT NULL REFERENCES "card"(id)
, card_set_id BIGINT NOT NULL REFERENCES "card_set"(id)
);
CREATE TABLE IF NOT EXISTS "card_have"
( id BIGSERIAL NOT NULL UNIQUE PRIMARY KEY
, card_print_id BIGINT NOT NULL REFERENCES "card_print"(id)
);
CREATE TABLE IF NOT EXISTS "card_want"
( id BIGSERIAL NOT NULL UNIQUE PRIMARY KEY
);
CREATE TABLE IF NOT EXISTS "card_want_set"
( card_want_id BIGINT NOT NULL REFERENCES "card_want"(id)
-- One the following two lines:
-- , card_print_id BIGINT NOT NULL REFERENCES "card_print"(id)
-- , card_set_id BIGINT NOT NULL REFERENCES "card_print"(id)
);
“我不关心卡片来自的集合”将通过不将任何card_print_id/card_set_id与card_want实例关联来表示。
这些解决方案的问题是关联的card_print_id/card_set_id可能不对应于card_id. 这可以通过在card_print_id/上引入约束来稍微缓解card_set_id,但这似乎仍然有点不雅和次优。
更简单的变体的解决方案可能如下所示:
CREATE TABLE IF NOT EXISTS "card_want"
( id BIGSERIAL NOT NULL UNIQUE PRIMARY KEY
, card_id BIGINT NOT NULL REFERENCES "card_print"(id)
, card_set_id BIGINT REFERENCES "card_set"(id) -- NULL means "I do not care about the set."
);
它共享解决更难变体的问题。
有没有更好、更优雅的方法来解决这个问题(更难或更简单的变体)?
提前致谢。