PHP4を利用したMySQL(4.0系)のデータの扱いが難しくなってきたので、どうすれば良いのか、アドバイスを頂ければと思います。


ユーザ関連データを3つのテーブルに分けて管理しようとしていますが、新規登録の際に3つのテーブルに3つとも失敗なくSQL文を実行するなど、とても不便になってきました。

テーブルは大体以下の用になっています。(実際にはもっとフィールドがあります。)

■ ユーザ名、メールアドレス、パスワード用テーブル users_table
user_id, mail_address, password ...

■ ユーザのプロフィール用 profile_table
user_id, birthyear, birthmonth, birthday, comment ...

■ ユーザの投稿数保存用 posts_table
user_id, posts ...


調べたところ、MySQL4.0系では、INSERTクエリーを3つ同時に叩くことは無理らしく、現在は、はじめのuser_idは、auto_incrementで、後の2つは、LAST_INSERT_ID() を駆使して、1つづつINSERTさせているのですが、user_idが全て一緒のこの3つのテーブルをもっとうまく管理する方法はないでしょうか?
テーブルは、user_idを軸に一つにまとめるべきでしょうか?

アドバイスを頂ければと思います。
#このページ、この本を読めばわかる、という情報も歓迎です。

回答の条件
  • 1人2回まで
  • 登録:2007/02/14 16:14:28
  • 終了:2007/02/14 19:45:08

ベストアンサー

id:b-wind No.1

b-wind回答回数3344ベストアンサー獲得回数4402007/02/14 16:24:17

ポイント100pt

もうちょっと各テーブルの情報が欲しいけれど、見た限り全てのテーブルは user_id をキーにして1対1で対応してます?

この場合全てのテーブルを1つにまとめるのがベストだと思います。

テーブル変更が難しければ InnoDB にしてトランザクション使えばいいと思いますけどね。


テーブルの正規化の問題かと。

データベース設計に関するサイト - [データベース]All About

id:p_question

ありがとうございます。

現在開発中ですが、MyISMを利用しています。

全て、user_id でフィールドが始まり、ユーザ登録時に3つのテーブルに同じuser_idで書き込むので、まとめることができる構造となっているということだと思います。



InnoDBとトランザクションは、未知だったので、ちょっと調べてみます。

2007/02/14 16:53:40

その他の回答(1件)

id:b-wind No.1

b-wind回答回数3344ベストアンサー獲得回数4402007/02/14 16:24:17ここでベストアンサー

ポイント100pt

もうちょっと各テーブルの情報が欲しいけれど、見た限り全てのテーブルは user_id をキーにして1対1で対応してます?

この場合全てのテーブルを1つにまとめるのがベストだと思います。

テーブル変更が難しければ InnoDB にしてトランザクション使えばいいと思いますけどね。


テーブルの正規化の問題かと。

データベース設計に関するサイト - [データベース]All About

id:p_question

ありがとうございます。

現在開発中ですが、MyISMを利用しています。

全て、user_id でフィールドが始まり、ユーザ登録時に3つのテーブルに同じuser_idで書き込むので、まとめることができる構造となっているということだと思います。



InnoDBとトランザクションは、未知だったので、ちょっと調べてみます。

2007/02/14 16:53:40
id:taknt No.2

きゃづみぃ回答回数13539ベストアンサー獲得回数11982007/02/14 16:22:15

ポイント100pt

通常、複数のテーブルを変更する場合、

最初に トランザクションをかけて

エラーが発生したら、ロールバック

すべて 処理できたら コミット とします。


INSERTは 三回 やればいいでしょう。

一度で 三つのテーブルにINSERTは できませんから。

一回ずつ コミットするのではなく、最後まで うまくできたら

コミットするのです。


>3つとも失敗なくSQL文を実行するなど

失敗の原因は 何でしょうか?

一意制約等でしたら、INSERTする前に 調べてから

INSERTしたらいいでしょう。

id:p_question

失敗したという意味ではありませんでした。

全てのINSERTが失敗なく、実行できないとデータに不整合が起きるので、「3つのINSERTの実行が失敗なく実行するなど」という意味でした。

現在開発しているものは、MyISMなので、トランザクションのために、InnoDBに変えるか、1つのテーブルにまとめるか、ちょっと考えてみます。

2007/02/14 16:51:42

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません