人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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を軸に一つにまとめるべきでしょうか?

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

●質問者: p_question
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:0系 MySQL password SQL アドバイス
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● b-wind
●100ポイント ベストアンサー

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

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

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


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

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

◎質問者からの返答

ありがとうございます。

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

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



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


2 ● きゃづみぃ
●100ポイント

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

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

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

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


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

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

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

コミットするのです。


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

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

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

INSERTしたらいいでしょう。

◎質問者からの返答

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

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ