コメントでのフィードバックに進みますが、これは私が推奨するものです (まだ変更を見逃す可能性がありますが、公正なスタートだと思います)。ドメイン モデルのすべてをキャプチャするようにしてください。後でデータを変更するのは簡単です..それがあれば。
カード |-これらはすべてのエディションのカードに共通です*
CardId、CardName、DeckColor、..
|-PK-| |-キーの可能性は? -|
エディション
EditionId、EditionName、ReleaseDate、..
|-PK -| |-キー? -|
CardEditions |-これらはカード/エディションごとに一意です
CardId、EditionId、レアリティ、ルール、..
|-PK -|
|-FK-| |-FK -|
(*Bill Karwin は多色のカードがあることを指摘しています、arg! その要件を把握するには、CardEditions のように CardsColors 関係をフロートします。色がエディション間で同様に変化する場合、私は泣きたいだけです..)
上に単純なスキーマを示しました (おそらく完全には正規化されていません)。ただし、それを処理するにはいくつかの異なる方法があるため、「Slowing Changing Data」を参照してください。
コメントの更新:
特定のエディションのカードを見つける方法、たとえばカード名とエディション名がわかっているとします。
SELECT * FROM Cards c
JOIN CardEditions ed
on ed.cardId = c.cardId
JOIN Edition e
on e.editionId = ed.editionId
WHERE c.cardName = 'Some Awesome Card'
AND e.editionName = 'Ultimate'
CardName と EditionName が主キー (PK) として使用され、対応する FK で (サロゲート CardId/EditionId の代わりに) 使用された場合、結合を完全に回避できた可能性があることに注意してください。どちらのアプローチが優れているかについては、大きな議論があります。クエリをよりシンプルに保ちたいので、結合テーブル (CardEditions など) を除いて複合 PK を避けるために代理キーを使用します。ただし、これでも EditionId 代理キーを使用/保持する必要があります..
可能性のあるキー (または「キー?」) は、このフィールドもキーとして扱う必要があると思われることを意味し、一意の制約 (および場合によってはインデックス) を適用する必要があります。リレーションシップには複数のキーを含めることができます。キーは、レコードを一意に識別するために必要な一連の列です。主キーは、この目的で通常使用される「選択された」キーです。
このモデルは完全に正規化されていないことに注意してください。1 つのリレーションに複数のキーが存在するという事実そのものです。ただし、代理キーと一貫性を保ち、2 次制約を定義することが最も生産的であることがわかりました。これは、私がレコードをモデルを駆動するエンティティとして扱いたいという事実の結果でもあります。