card
、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."
);
それはより難しいバリアントへの解決の問題を共有しています。
この問題にアプローチするためのより優れた、よりエレガントな方法はありますか (難しい方法または簡単な方法のいずれか)?
前もって感謝します。