2011-12-23 6 views
1

Iは、以下の構造を有する第3のテーブル(Repair_Partsテーブル)を設定に関する質問を有する:は、2つの外部キーに関連するデータを格納するためのテーブル内のフィールドの設定、および番号

パーツ

Part_id(INT、符号なし、オートインクリメント) - 主キー

PART_NAME(VARCHAR(50)) - ユニーク

Part_d escrip(TEXT)

修復

Repair_id(INT、符号なし、オートインクリメント) - 主キー

Repair_name(VARCHAR(50)) - ユニーク

Repair_descrip(TEXT)

修理工場

Repair_id - ( - パート表のPart_idフィールドに関する外部キー)

Repair_Part_Item位 -

Part_id(外部キーは、テーブルのRepair_idフィールドを修復するために関連する)特定のRepair_idに関するPart_idフィールドエントリの数に基づいて番号付け(修復に関連するパーツに関するデータを格納するために使用されます) - このフィールドには、異なるrepair_idごとに「1」でナンバリングを開始します。

質問

例えば、PHPのプログラムは、ユーザーが自動車の修復を行う方法の指示を作成することができます言うことができます。ユーザーは、修復が「Repair Battery」(Repair_nameフィールド(VARCHAR(50))の下のRepairテーブルにデータを挿入する)と修復の簡単な説明(Repair_descripフィールドの下のRepairテーブルにデータを挿入するTEXT))。ユーザーは、 "Check Battery"修理に関わる特定の部品を指定することもできます。この修理は1つまたは複数の修理が可能ですが、この場合は2つの異なる部品、「オルタネーター」および「バッテリー」です。

データベースが修復に必要な特定の部品を追跡するように、このRepairPartsテーブルを作成するにはどうすればよいですか?どのエンジンが必要ですか? MyISAMまたはINNODB?

私がデータベースの正規化について読んだことから、テーブルを構造化する正しい方法があるようですが、私が望むようにデータを格納するRepair_Part_Item#フィールドを作成する方法を理解できません。具体的には、テーブルとそのフィールドを許容範囲内で分割したと仮定すると、Repair_art_Item#フィールドは、Repair_idフィールドエントリごとに1で番号を付けて、どのRepair_idを持つ各行についてカウントアップするのですか?異なるPart_id(同じRepair_idとPart_idを持つ重複する行を許可しない)?

これは正規化について読んだことから、テーブルを構造化する正しい方法と思われますが、Repair_Part_Item#フィールドを正しく動作させる方法を理解できません。

私はMySQLとPHPの初心者ですが、PHPの方程式に入る前にデータベースを設定しようとしています。

答えて

2

私が正しく理解した場合、現在のRepair_idに基づいて、1から始まるシーケンスを生成する特定のフィールドを持つことが必要です。この機能は、複合プライマリキー(とidauto_increment)を作成するMyISAMエンジンの機能を使用することで最も効果的ですが、MyISAMテーブルは外部キーの関係を静かに無視するため、カスケードの削除や更新は行われません。 InnoDBは外部キーの制約をサポートしていますが、MyISAMと同じ方法でauto_incrementの生成をサポートしていません。あなたができる最も良いことは、現在のRepair_idに基づいて1ずつ増加する連続番号を生成するトリガーを作成することです。

DELIMITER $$ 

CREATE TRIGGER `your_trigger_name` AFTER INSERT ON `your_table_name` 
FOR EACH ROW BEGIN 

SET new.Repair_Part_Item = (SELECT IF(ISNULL(Repair_Pair_Item, 1, MAX(Repair_Part_Item) + 1) FROM your_table_name WHERE Repair_id = new.Repair_id); 

END 

DELIMITER ; 
+0

お返事ありがとうございます。したがって、repair_idフィールドとpart_idフィールドはどのようなタイプになりますか? INT? VARCHAR?それとも重要なのでしょうか?このことが私には分かりますか、ごめんなさい。私はこれに新しいです。 –

+0

FKは常に指すタイプにバインドされています。したがって、 'part_id'が' parts.id'を指している場合は、 'part.id'と同じ型と表示長でなければなりません。それを短くするには、テーブルに整数を使用します。 –

+0

トリガー名は任意のものを選択します。私はSQL構文でエラーが発生する可能性が最も高いことに留意してください。私は参考のためだけに投稿しました。そのようなトリガーを作成する方法を知ることができます。その考え方は 'Repair_id'値に基づいて' Repair_Part_Item'をインクリメントすることです。 'Repair_Part_Item'がNULL(またはゼロ、あなたのカラムのデフォルト値に指定したものがわからない場合)の場合、それはシーケンスの最初のメンバ(番号1)です。それはロジックのためのものです - 私が実際にトリガーを正しく書いたかどうかテストしていないために実装がオフになるかもしれません:) –

関連する問題