2

cardcard_setsおよびを表す (簡略化された) データベース スキーマがありcard_printsます。単一のcardを複数の で取り上げることができますcard_sets。有効な(card, card_set)ペアは と呼ばれcard_printます。

card_haveまた、関係とをモデル化する必要がありcard_wantます。

は、「このcard_haveセットのカードを持っている」という表現ができる必要があります。

は、次のcard_want両方を表現できる必要があります。

  1. 「私はこのカードが欲しい。それがどのセットのものかは気にしない。」
  2. 「私はこのカードが欲しい。セットからのみ欲しい」. (あるいは、このより簡単な変形を考えてみましょう: 「私はこのカードが欲しい; 私はそれがこのセットからだけ欲しい」.)

は、可能なのcard_wantサブセットを表すことに要約されます。card_printscard

これは私がこれまでに持っているものです(少し単純化されています):

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_idcard_want

これらのソリューションの問題は、関連するcard_print_id/card_set_idcard_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."
  );

それはより難しいバリアントへの解決の問題を共有しています。

この問題にアプローチするためのより優れた、よりエレガントな方法はありますか (難しい方法または簡単な方法のいずれか)?

前もって感謝します。

4

1 に答える 1