2011-05-28 11 views
1

私は解決したいと思っている縁のケースを得ました。MySQL ::エッジケース::混合型外部キー::可能か夢見るのか?

他の統計情報の中でも、ノンリーグ/非ロスタスの相手を含むかもしれないボックススコアの結果を記録するスポーツレポートを掲載します。これにより私は、Fooの対戦相手が私たちのシステムでは名簿を持っていない(彼らもそうでない)場合があることを意味します。

敵のチームの統計情報を単純に省略するのではなく、所有者は以前から、プレーヤー名の入力を許可するオプションを組み込んでいることを以前に要求していました(既存の名簿のプレーヤー名のドロップダウンリストから[playerID] )。したがって、私たちの名簿テーブルにはint型のplayerID PKカラムがありますが、私たちの統計テーブル(犯行&防衛)にはvarcharのplayerIDカラムがあります。

これにより、チーム名簿が存在するかどうかにかかわらず、(私たちは単純にプレーヤの名前としてvarchar statテーブルのplayerIDを表示していない場合)ロスタテーブルに対して外部結合を行い、一致レコードを取得できます。ハッキングされていますが、仕事をしています。

結果テーブルにFKがあるので、ゲーム結果が削除されると関連する統計情報も表示されます。しかし、重要な制約がありません:ロスタ>>統計。 playerIDの列のタイプが一致しないため、FKを追加できません。制約の隙間を埋める必要があります(つまり、選手を名簿から削除すると、すべての統計情報が孤立してしまいます)。

この問題を解決する方法の候補はありますか?

+2

強制的にカスケード削除を実行するには、トリガを使用します。 –

+0

+1 @Denis、yes、またはミドルウェア層でそれを処理します。しかし、ORMに統合しようとすると、ミドルウェアで制約を定義してMySQLで適用できるようになることが期待されていました。 – virtualeyes

+0

私はそのためにトリガを使用したいと思います。または、必要に応じてモデルを中間テーブルで少し修正してください。 –

答えて

0

私の経験では、これは開発者に発生する問題ですが、通常は実際にはあまり進まないことがあります。

実際のユースケースを削除していますか?ユーザーは、ゲームを見て、歴史的なプレーヤーの名前を見ないために戻ってみたいですか?

  1. マークプレイヤー非アクティブに、そしてあなたが代わりに削除するので、自分の名前で 非アクティブフラグのいくつかの種類とそれらを表示することができます。

    は、私は2つの変更をお勧めします。
  2. StatsPlayerName列を統計表に追加し、すべての「テキスト」プレーヤー名をplayerID列からその名前に移動します。次に、statにはplayerIDまたはStatPlayerNameのいずれかが必要です。さて、あなたはあなたの参加をすることができ、RosterPlayerNameがヌルなら、StatsPlayerNameを表示します。これにより、playerIDに外部キー制約を追加することができます。
+0

meh、この昨年の投稿以来、私のアプローチを変更しました。すべてのstatエントリには、外部キーの問題が解決されるだけでなく、ストレートで効率的なクエリが実行されます(外部結合やnull条件の必要はありません)。それを言うと、答は答えです。事実の数ヶ月後でさえ、チェックマークが付いています。十分なフィードバックがあります。 – virtualeyes