こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

データの保存について

phpで会員制サイトの制作を勉強しています。
データベースへはPDOで接続しています。
MySQLデータベースを使用しています。


現在、記事投稿サイトの作成を勉強しています。
できれば、記事の内容に「記事を投稿した投稿者のページ」へのリンクと、
投稿者のページに「今まで投稿した記事の履歴」がリンクつきで表示されるようにしたいです。


そこで、まだ勉強を始めたばかりなので、今ある知識だと下のような方法しか思いつきませんでした。


1、記事データ保存用のテーブルと、ユーザー情報保存用のテーブルを作成
2、記事データ保存用のテーブルのカラムにユーザーIDを格納するカラムを作成
3、記事ページからはユーザーIDを元にユーザー情報保存用のテーブルからユーザー情報を検索して投稿者のページのリンクを設置
4、投稿者ページの記事履歴には記事テーブルの全てデータからユーザーIDカラムのIDが一致するものをSELECTする



勉強とはいえ、作成中のサイトを少しでもしっかりした作りにしたいので、他にもっと良い方法があれば知りたいです!


ご回答、よろしくお願いします。

投稿日時 - 2014-11-20 22:19:26

QNo.8831879

困ってます

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

>できれば記事IDは乱数を格納してプライマリーキーに指定することで
>重複しないようにして付与できたらいいなと思っていますが、やはり
>A_Iの方が良いのでしょうか?

自分で生成すると新規作成時の重複チェックが必要になりますからねぇ。それが面倒でなければ、substr(md5(microtime()),0,8) とかでも実用にはなると思います。

投稿日時 - 2014-11-21 13:30:00

補足

ご回答、ありがとうございます!

>自分で生成すると新規作成時の重複チェックが必要になりますからねぇ。
>それが面倒でなければ、substr(md5(microtime()),0,8) とかでも実用
>にはなると思います。

「重複チェック」についてですが、記事IDをプライマリーキーに設定した場合、同じ記事IDをINSERTしようとするとエラーを吐かれると思いますので、
IDの生成やINSERT処理を全てトランザクションでまとめて、エラーを吐かれたらロールバックしてIDの再生成など再度処理を行うようにすれば重複チェックになるでしょうか?

また、前の補足コメントで質問させて頂いたことについて再質問になりますが、検索条件として使用するカラムは全てインデックスにしても問題ないでしょうか?複数インデックス設定した場合、デメリットはあるのでしょうか?

お返事、頂けると有難いです。

投稿日時 - 2014-11-21 14:46:54

お礼

上記補足ですが、トランザクション処理を勘違いしていました。
try~catchでエラーを吐かれたら再処理が正しいですかね・・・

投稿日時 - 2014-11-21 15:12:44

ANo.2

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

>今ある知識だと下のような方法しか思いつきませんでした。

他に方法はないと思う。

記事テーブルの投稿者IDをインデックスにしておくように(プライマリキーは記事IDをAUTO_INCREMENTで付与すると思うので)。

なお

>記事ページからはユーザーIDを元にユーザー情報保存用のテーブルから
>ユーザー情報を検索して投稿者のページのリンクを設置

投稿者ページはユーザIDを引き渡してそのユーザの内容を表示するので、わざわざこの時点でユーザ情報テーブルを読む必要はない(記事テーブルとjoinして一緒に読んでおいてもかまわないけど)。

投稿日時 - 2014-11-20 22:32:55

補足

ご回答ありがとうございます!

>記事テーブルの投稿者IDをインデックスにしておくように
>(プライマリキーは記事IDをAUTO_INCREMENTで付与すると思うので)

インデックス設定について知らなかったので調べました。複数カラムにインデックス設定することができるようですが、
投稿者ID以外にもタイトル格納カラム等も検索条件に使用するので、
検索条件として使用するカラムは全てインデックスにした方が良いですかね?

また、記事IDは$GETで記事内容のページのURLに含めたいので、
あまり通し番号にしたくないです。(URLで記事の識別番号が数字のみの連番であきらかに通し番号になっているようなサイトをあまり見かけないため、個人的にちょっと投稿された順番がURLで見え見えになってしまうのが嫌なので)
できれば記事IDは乱数を格納してプライマリーキーに指定することで重複しないようにして付与できたらいいなと思っていますが、やはりA_Iの方が良いのでしょうか?
A_Iは内部管理用のIDに付与しようと思います。(あまりカラムとして意味を成さないかもしれませんが・・・)

>投稿者ページはユーザIDを引き渡してそのユーザの内容を表示するので、
>わざわざこの時点でユーザ情報テーブルを読む必要はない
>(記事テーブルとjoinして一緒に読んでおいてもかまわないけど)。

確かにその通りですね!
ご指摘頂きありがとうございます!

お返事頂けると有難いです。
よろしくお願いします。

投稿日時 - 2014-11-21 11:27:27

あなたにオススメの質問