会員関連テーブルの構成について

このQ&Aのポイント
  • MySQLとPHPでデータベースを勉強している初心者です。会員関連のテーブルについて下記のような構成を考えています。
  • idを主キーにしてTable AとTable Bを関連付けするつもりですが、何らかの原因で使っている途中でidの関連付けがうまくいかなくなることなどあるのでしょうか? そのような場合、idにずれが生じても見つけられないのではなどと考えてしまいます。Table Bにidとユーザー名を載せたり、いっそ一つのテーブルで管理するほうが確実でしょうか。通常はどのようにしていますか?
  • Table Bは現会員と退会者を一つのテーブルで管理し、現会員のプロファイルの一部を公開します。退会者のプロファイルは使わないのですが、新規登録者とユーザー名がかぶらないようになど保管の必要も感じます。退会者の情報の取り扱いについてもアドバイスいただければと思います。
回答を見る
  • ベストアンサー

会員関連テーブルの構成について

MySQLとPHPでデータベースを勉強している初心者です。会員関連のテーブルについて下記のような構成を考えています。 Table A (会員ログイン用) - id  - ユーザー名 - パスワード Table B (会員プロファイル) - id - item 1 - item 2 - item 3   ・   ・ - 登録日 - 退会日 idを主キーにしてTable AとTable Bを関連付けするつもりですが、何らかの原因で使っている途中でidの関連付けがうまくいかなくなることなどあるのでしょうか? そのような場合、idにずれが生じても見つけられないのではなどと考えてしまいます。Table Bにidとユーザー名を載せたり、いっそ一つのテーブルで管理するほうが確実でしょうか。通常はどのようにしていますか?  Table Bは現会員と退会者を一つのテーブルで管理し、現会員のプロファイルの一部を公開します。退会者のプロファイルは使わないのですが、新規登録者とユーザー名がかぶらないようになど保管の必要も感じます。退会者の情報の取り扱いについてもアドバイスいただければと思います。

  • MySQL
  • 回答数2
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

#1です。 オープンソースなので、「十分注意してください」と言いたかったのですが。。。 仮にMySQLにバグがあっても、パッチの有無等を調べるのは、保守契約がなければ自力で行うことになります。 auto_incrementに関し、MySQLのマニュアルにいくつか注意事項が掲載されていまのから、参考まで。 (1)MyIsamの場合、auto_incrementの列がキーの2番目の構成列であった場合 http://dev.mysql.com/doc/refman/4.1/ja/example-auto-increment.html (2)ロールバックした場合 ロールバックした場合 http://mysql.osuosl.org/doc/refman/4.1/ja/innodb-auto-increment-column.html =====備考===== あるRDBMSに関しては専門知識があり、他の複数のRDBMSに関しては利用経験などがあるため、内容により「専門家」、「経験者」、「一般人」を使い分けています。

anklet
質問者

お礼

MySQL の注意事項について早速読んでみました。詳しい情報をありがとうございます。 どちらも知らなかった事項なので大変参考になります。InnoDBで作る時のトランザクションの扱いは重要ですね。あまり意識してなかったのですが、オープンソースであることも念頭において使うようにしたいと思います。

その他の回答 (1)

回答No.1

MySQLのバージョンが不明ですが、InnoDBを使い、トランザクション単位で双方の表を更新するなら、心配するような事象はバグがない限り発生しないはずです。 ただし、これはあくまでも「異常処理中でも、仕様通りに動けば」という部分があり、開発元や保守請負会社との契約次第で、サポートを受けられる範囲があります。 万一のトラブルにも備える必要があるなら、商用RDBMSを選択することもできます。さらに、「(利用者側のミスもあり)消失してしまったデータの復旧」に全面的にサポートして欲しいといったケースもあるなら、国産のRDBMSを使用し、保守契約を結ぶといった選択肢もあります。

anklet
質問者

お礼

MySQLは5.0.41で、InnoDBで作ります。現在はwindows上で練習しています。 以前4.0.20cでidにindexをつけて auto_incrementにしたテーブルを作ったのですが、古い(小さい数の)idを数十件まとめて削除した後で新しくデータを挿入、コマンドプロンプトで表示すると、最後のidの次ではなくなぜか削除した番号にデータがふられていくという現象が起きました。その時は原因がわからないままテーブルを作り直してしまったので気になったのです。 レンタルサーバー会社による一般的な保守管理だけのサイトになるので安定運用を優先したいのですが、用途にあわせて別テーブルにする方が負荷が少なくレスポンスも早そうです。トランザクション単位で双方の表を更新すれば通常は発生しないこと--経験者の方からのアドバイスはとても参考になります。バグを作らないことが大切ですね。ありがとうございます。

関連するQ&A

  • テーブル設計について

    会員制の小さなサイトを運営しています。 会員は会員IDで管理しているのですが、テーブル設計が適切であるか判断できず、助言を頂きたく書き込みさせて頂きました。 現在、会員情報テーブル(info)というテーブルが全ての基本となっています。 このテーブルには、会員IDの他、名前や性別、住所、自己紹介文などほとんど全ての会員情報が含まれています。 このほかに会員同士の交流用のテーブル(koryu)がいくつかあり、 そこには、会員IDとその会員が行った内容が記録されています。 で、現状、交流用テーブルを使用する場合、常に会員の名前を会員情報テーブルから引っ張ってきており、これが、処理的に重いのでは無いか、と思っています。 以下はたとえばの例ですが、  select koryu.id, info.name, koryu.contents from info,koryu where koryu.id=info.id のように、毎回、(ほぼ)名前だけを引っ張ってきています。 引っかかっているのは、この「名前だけ」というところで、例えば、会員IDと名前しかないテーブルを作成すれば、もしかしたら、処理が軽くなるのでは・・と思っているのです。 20カラムあるテーブルと関連付けを行う場合と、2カラムのテーブルと関連付けを行う場合、 2カラムのテーブルのほうが、処理は軽くなるのでしょうか?また、軽くなる場合、そうしたほうが良いのでしょうか? (現在、1000名くらいしか会員がいないため、処理が重いということは無いのですが、 安いサーバを使用しているため、処理はなるべく軽くしておきたいと思っています。) よろしくお願いします。

    • ベストアンサー
    • MySQL
  • MySQL複数テーブルからの情報取得に関しまして

    Aテーブル...ユーザ情報 Bテーブル...商品情報(AテーブルのユーザIDを列として持っています) Cテーブル...アイテム情報(Bテーブルの商品IDを列として持っています) Bテーブルの一覧リスト表示の画面にて、検索項目として、 Aテーブルのユーザ名、Cテーブルのアイテム名があります。 現在は、LEFT JOINを使って、検索、呼び出しを行っておりますが、 多数のカラムを指定して呼び出しを行っているため、SQL文が長くなってしまっており、 もっとすっきりとしたSQL文を記述したいと考えております。 ※Aテーブル,Bテーブルの組み合わせは他の画面でもよく使われております。 viewという機能を使うことによって、これをすっきりと記述できるようになるのではないかと考えておりますが、viewはこのような使い方をしてもいいのでしょうか。 または、もっとすっきりとした記述を行う技術のアドバイスをお願いいたします。 よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • 関連テーブルのレコード数の取得

    SQL初心者です 関連テーブルのレコード数を取得したいのですがうまくいきません テーブル名:user user_id,user_name 1,aaa 2,bbb 3,ccc テーブル名:user_agreements user_id,money 1,5000 2,3000 2,5000 1,8000 2,4500 3,10000 3,2500 上記のようなデータがあった場合に、ユーザーIDと契約件数という結果を得たいと思っています user_id,sum_agreements 1,2 2,3 3,2 このような結果を得る為のSQL文はどのように書けば宜しいでしょうか 宜しくお願い致します

  • ACCESS テーブルの結合

    同じmdb内で複数テーブルがあります。(テーブル1から10まで)フィールド名はすべて同じです。それぞれのテーブルのIDは1からオートナンバーになってます。 【例】 テーブル1  フィールド名: ID A B C テーブル2   フィールド名:ID A B C  ・ ・ テーブル10   フィールド名:ID A B C  ひとつのテーブルで管理したいのですが・・・教えてください。

  • 一度に関連する他のテーブルの行も取得したい

    MySQLバージョン4.1.16を使用しています。 ちょっとPHPも絡んでくるのですが、こちらのジャンルでお願いします。 テーブル「items」はテーブル「users」のuser_idカラムを 外部キーとして持っています。ここで「users」テーブルの行を取得して、 その値(user_idのaaaaやbbbbなど)を利用して 「items」テーブルのそれぞれ対応する行を取得したいのですが、 $users = (usersテーブルの行を取得するSQL文); $index = 0; foreach ($users as $row) { $users[$index]['items'] = (user_idに対応したitemsテーブルの行を取得するSQL文); $index++; } print_r($users); /* Array (  [0] => Array   (    [user_id] => aaaa    [items] => Array     (      [0] => Array       (        [user_id] => aaaa        [item_name] => アイテム1       )      [1] => Array       (        [user_id] => aaaa        [item_name] => アイテム2       )     )   )  [1] => Array   (    [user_id] => bbbb    [items] => Array     (      [0] => Array       (        [user_id] => bbbb        [item_name] => アイテム3       )     )   ) ) */ と、このように2段階に分けてやれば取得できるのですが、 そうではなくてこれを一度に取得できるSQL文というかやり方はあるのでしょうか? $users = (usersテーブルの行を取得するSQL文);←この段階でそれぞれ対応してるitemsテーブルの行まで取得したい

  • 異なるテーブル間の和

    テーブルAの属性item1とテーブルBのitem1の和を求めるにはSQLでどのように記述すれば良いのでしょうか?? tableA ------ id item1 item2 pointer tableB ------ id item1 item2 pointer という2つのテーブルで,tableBのpointerはtableAのidを指しています.

  • mysqlのデータベース設計(1テーブルで管理)

    お世話になります。 現在、会員がログインしてブログ管理できる(記事を作成・編集できるシステム)を考えています。 そこでデータベース設計について質問があります。 一般的には、 ・ユーザー情報に関するテーブル ・ブログ記事に関するテーブル この2つを以下のような感じで設計すると思うのですが↓ ■usersテーブル ・id ・ユーザー名 ・パスワード ■articleテーブル ・id ・user_id(記事投稿者のid) ・contents(ブログタイトル、ブログ本文) ・created ・modified 私は、この2つを1つのテーブルですべてまとめて管理することを考えているのですが、 何かデメリットはあるのでしょうか?↓ ■usersテーブル(このテーブル1つですべてまとめて管理) ・id ・ユーザー名 ・パスワード ・contents(ブログタイトル|ブログ本文|記事投稿日|記事編集日) ・created ・modified ちなみにブログ記事は、区切り文字で分けながらcontentsにどんどん詰め込んでいき(updateする)、 取り出すときは区切り文字をexplodeしていく形を考えています。 実際にはもっと項目が多くなるのですが、1ユーザーの情報をすべて1つのテーブルで管理することで個人的に非常にわかりやすい、さらに単純なのでこちらのほうが速度も速いのではないかと思っているのですが、良くないのでしょうか?(あまり見かけないので) どなたか教えていただけると幸いです。 よろしくお願い致します。

    • ベストアンサー
    • PHP
  • 楽天会員(infoseek会員)について

     現在楽天の会員に登録しています。それとは別にinfoseekの会員にもなっており、数年前の楽天とinfoseekのサービス統合による関連付けがすでに完了しています。(つまり楽天とinfoseekのログインID、パスワード、楽天スーパーポイントの共通)  そんな中、先日ログインID、パスワード、infoseekメールのアドレスが知られたくない人物にばれてしまいました。ログインID、パスワードは直ぐに変更しましたがinfoseekメールアドレスはどこを見ても変更できそうにありません。  普通なら会員登録を削除(退会)し、新たに会員登録し新たなinfoseekメールアドレスを得ればよいのですが、現在スーパーポイントが貯まりに貯まっており、また、この会員登録で楽天カードを発行したので出来ればinfoseekメールアドレスのみ変更できればと思っています。また、TSUTAYAなどにポイント移行は考えていません。  そこで質問ですが、infoseekメールアドレスのみ変更は可能でしょうか?

  • PDOで複数のテーブルを扱いたい

    PDOで複数のテーブルを扱いたい 現在ドットインストールというサイトで勉強しております。 http://dotinstall.com/lessons/sns_php_v2 このユーザー管理のレッスンで自分なりに応用してみようと戦っております。 これでは、ログインを行い登録したユーザーのプロフィールを表示するという内容なのですが、管理人とユーザーという風に分けてadminのテーブルに管理者を作成し登録し、登録された会員は自分のプロフィールを表示できるという流れにしたいと思っております。 レッスン通りでは問題なく出来ました。 そこで次にテーブルを分けて表示することにチャレンジしております。 users(会員テーブル)とは別にaddress(住所テーブル)を作成し会員テーブルと同じようにidカラムと住所を入れるtext項目をデータベースに作成しチャレンジしました。 サイト通りプロフィールを表示させる方法でやればこちらもテーブルを読み込ませることはできるのですが、URLの数値を変えれば当然他の人の情報も見えてしまいます。 $meというセッションで取得したいのですがusersの情報はログイン時にセッションとして受け取っているので#meで受け取りができるのですがaddressのテーブル情報にもこのセッション($me)で表示させるにはどのようにすればよいのでしょうか? やりたいことはログインした会員の情報のみ(他人のデータをみれない)表示させたい。 データベースのほかのテーブルもusersのセッションで共有したいということです。 わかりにくい説明で申し訳ございませんが、お助けいただけませんでしょうか。

    • ベストアンサー
    • PHP
  • 2テーブルが同じユーザテーブル参照するときの結合

    2つのテーブルで、同じユーザテーブルを参照してデータ取得したいのですが、 どうやって結合すれば良いのでしょうか? ■概要 ・ユーザがアクションに挑戦すると、結果を表示 ・その際、「アクション作成者」と「アクション挑戦者(ユーザ)」を表示したい ※「作成者」「挑戦者」は、同じ「user」テーブルで管理したい ■3テーブル ・「result」「action」「user」 ・「result」「action」テーブルには、それぞれ「user_id」カラムがある ・「result」テーブルには、「action_id」カラムがある。1対多? ■知りたいこと ・一気にまとめて一覧として取得する方法 ・最終的に「結果」と、「result」「action」それぞれに対応した「user」テーブルの「name」カラムを取得したい ■試してみたこと ・これだと「挑戦者名」が取得できない       SELECT *        FROM result r         LEFT JOIN `action` a ON r.`action_id` = a.`id`         LEFT JOIN `user` u ON r.`user_id` = u.`id` ・これだと「挑戦者」のユーザIDしか取得できない       SELECT *,a.user_id AS actionuser_id        FROM result r         LEFT JOIN `action` a ON r.`action_id` = a.`id`         LEFT JOIN `user` u ON a.`user_id` = u.`id`

    • ベストアンサー
    • MySQL