- ベストアンサー
データ保存について
- phpで会員制サイトの制作を勉強しています。
- データベースへはPDOで接続しています。MySQLデータベースを使用しています。
- 記事投稿サイトの作成を勉強しており、投稿者のページへのリンクと記事の履歴表示を実装したいと考えています。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>できれば記事IDは乱数を格納してプライマリーキーに指定することで >重複しないようにして付与できたらいいなと思っていますが、やはり >A_Iの方が良いのでしょうか? 自分で生成すると新規作成時の重複チェックが必要になりますからねぇ。それが面倒でなければ、substr(md5(microtime()),0,8) とかでも実用にはなると思います。
その他の回答 (1)
- agunuz
- ベストアンサー率65% (288/438)
>今ある知識だと下のような方法しか思いつきませんでした。 他に方法はないと思う。 記事テーブルの投稿者IDをインデックスにしておくように(プライマリキーは記事IDをAUTO_INCREMENTで付与すると思うので)。 なお >記事ページからはユーザーIDを元にユーザー情報保存用のテーブルから >ユーザー情報を検索して投稿者のページのリンクを設置 投稿者ページはユーザIDを引き渡してそのユーザの内容を表示するので、わざわざこの時点でユーザ情報テーブルを読む必要はない(記事テーブルとjoinして一緒に読んでおいてもかまわないけど)。
補足
ご回答ありがとうございます! >記事テーブルの投稿者IDをインデックスにしておくように >(プライマリキーは記事IDをAUTO_INCREMENTで付与すると思うので) インデックス設定について知らなかったので調べました。複数カラムにインデックス設定することができるようですが、 投稿者ID以外にもタイトル格納カラム等も検索条件に使用するので、 検索条件として使用するカラムは全てインデックスにした方が良いですかね? また、記事IDは$GETで記事内容のページのURLに含めたいので、 あまり通し番号にしたくないです。(URLで記事の識別番号が数字のみの連番であきらかに通し番号になっているようなサイトをあまり見かけないため、個人的にちょっと投稿された順番がURLで見え見えになってしまうのが嫌なので) できれば記事IDは乱数を格納してプライマリーキーに指定することで重複しないようにして付与できたらいいなと思っていますが、やはりA_Iの方が良いのでしょうか? A_Iは内部管理用のIDに付与しようと思います。(あまりカラムとして意味を成さないかもしれませんが・・・) >投稿者ページはユーザIDを引き渡してそのユーザの内容を表示するので、 >わざわざこの時点でユーザ情報テーブルを読む必要はない >(記事テーブルとjoinして一緒に読んでおいてもかまわないけど)。 確かにその通りですね! ご指摘頂きありがとうございます! お返事頂けると有難いです。 よろしくお願いします。
お礼
上記補足ですが、トランザクション処理を勘違いしていました。 try~catchでエラーを吐かれたら再処理が正しいですかね・・・
補足
ご回答、ありがとうございます! >自分で生成すると新規作成時の重複チェックが必要になりますからねぇ。 >それが面倒でなければ、substr(md5(microtime()),0,8) とかでも実用 >にはなると思います。 「重複チェック」についてですが、記事IDをプライマリーキーに設定した場合、同じ記事IDをINSERTしようとするとエラーを吐かれると思いますので、 IDの生成やINSERT処理を全てトランザクションでまとめて、エラーを吐かれたらロールバックしてIDの再生成など再度処理を行うようにすれば重複チェックになるでしょうか? また、前の補足コメントで質問させて頂いたことについて再質問になりますが、検索条件として使用するカラムは全てインデックスにしても問題ないでしょうか?複数インデックス設定した場合、デメリットはあるのでしょうか? お返事、頂けると有難いです。