SQL データベース (より具体的には MySQL) には、行が 2 つの意味を持つテーブルがあります。
文脈を理解するために、表はゲームの状態を表します。次に、各行は、保存された状態のゲームまたは初期のゲーム状態 (レベルを表す) である可能性があります。
これを設計/実装する方法について、チームメイトと少し話し合っています。私は常にこれを行うと言われてきました:
CREATE TABLE games (
id INT,
PRIMARY_KEY (id)
)
CREATE TABLE levels (
id INT,
PRIMARY_KEY (id),
FOREIGN_KEY (id) REFERENCES games(id)
)
CREATE TABLE saved (
id INT,
PRIMARY_KEY (id),
FOREIGN_KEY (id) REFERENCES games(id)
)
これを行うよりも「優れていた」:
CREATE TABLE games (
id INT,
`type` ENUM('level', 'saved')
PRIMARY_KEY (id)
)
最初のケースでは、保存からのフェッチは「結合」で行われ、2 番目のケースでは「where type=level」で行われます。
では、データベースの設計とパフォーマンスの両面でどちらが優れているのでしょうか?
パフォーマンスの方が心配ですが、join が where を使用した単純な選択よりもはるかに遅いかどうかはわかりません。