我有一个(简化的)数据库模式,它代表card
和。单个可以在多个. 一个有效的对被称为 a 。card_sets
card_prints
card
card_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."
);
它共享解决更难变体的问题。
有没有更好、更优雅的方法来解决这个问题(更难或更简单的变体)?
提前致谢。