データベースの設計に問題があります。私は、ウェブサイトとデータベース設計の全体的な理解を深めるのに役立つ小さなプロジェクトとしてブラウザゲームを作成しています。
もちろん、自分で解決策を見つけようとしなかった場合は、ここに投稿しません(質問を検索すると、「多くの2つのテーブルを作成する方法」などの他の質問が見つかるものの1つです)
状況:
すべてデータベース上で実現されている建物/研究があります(多くのハードコーディングを防ぐため)
CREATE TABLE IF NOT EXISTS `structType` (
`idStructType` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(30) NOT NULL,
`idRace` int(11) NOT NULL,
UNIQUE (name),
FOREIGN KEY (idRace) REFERENCES race(idRace),
PRIMARY KEY (idStructType)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
もちろん、それらの建物や研究のいくつかには技術ツリーがあります。
ここから私の問題が始まります。構造には、複数の調査だけでなく、要件として複数の構造を含めることができます。それはまた逆になります:
研究はまた必要条件として建物/他の研究を持つことができます。
そこで私は、次のような「多対多」の解決グループを作成し始めました。
CREATE TABLE IF NOT EXISTS `structtypeReqStructtype` (
`idStructType` int(11) NOT NULL,
`idStructType_required` int(11) NOT NULL,
`level` int(11) NOT NULL,
UNIQUE (idStructType, idStructType_required, level),
FOREIGN KEY (idStructType) REFERENCES structType(idStructType),
FOREIGN KEY (idStructType_required) REFERENCES structType(idStructType)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
結局、これは私に構造と研究の間の技術ツリーのためだけに4つのテーブルを残します、船と防御は言うまでもなく、それは私にとって悪いデザインのように感じます。
これを行うには、ほとんどもっと良い方法が必要です。私が思考プロセスをどの方向に進めるべきかについて少し助けを得ることができればとてもうれしいです。
これはかなり自由形式の質問ですが、ここにいくつかの考えがあります。
最もクリーンなデザインは、研究項目を含むすべての「ビルド可能」を含むテーブルになると思います。これは、コスト、ビルダー(buildablesテーブルへのリンク)、名前、およびIDである可能性があります。
この上にエクステンダーテーブルを追加できます。1つの「ビルド可能」を参照する「構造」テーブルを作成し、「構造」に必要なフィールドを追加します。
最後に、「前提条件」テーブルを作成できます。これには2つのビルド可能IDがあります。1つは問題のビルド可能ID用で、もう1つは必要なアイテム用です。これで、structToResearch、structToStruct、researchToStruct、researchToResearchに必要な個別のテーブルがなくなりました。
TL:DR; 多対多の関係が有意義に適用されるベーステーブルを作成します。ベーステーブルへの外部キーを保持するタイプごとの特定のテーブルを作成します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加