dポイントプレゼントキャンペーン実施中!

PHPとMySQLを勉強中です。
データベースと連携させた「お気に入りのお店」を登録するような地図サイトを作ろうと思っているのですが、テーブル設計について疑問ですので、よろしければ教えてください。
ちなみにMySQLへ登録する項目は、
id(連番)、日付、ユーザーID、ユーザーパス、お店の名前、お店の住所、電話番号、HPアドレス、お店の写真 などを考えています。

1、効率のいいテーブルの設計とはどのようなものでしょう?
素人考えでは、一括で管理したほうがよさそうだと思うのです。
ですが、他の方のスクリプトをダウンロードして見てみると、ほとんどテーブルが分割されていることが多いです。
どのような意図なのでしょう??

2、バイナリデータはbase64でテキストにしたほうがいいと本に書いてありましたが、テーブルも別にしたほうがいいのでしょうか?

3、このような内容について、詳しい本などがありましたらぜひ教えてください。負荷分散とかバックアップなどについても勉強しようと思っています。

結局は、どのような使われ方をするかで設計が変わってくるような気がしますが、何分、勉強し始めたばかりでよく分かっていません。。
お手すきのときに教えてください。
よろしくお願いいたします。

A 回答 (1件)

効率のよい:「正規化されてる」でしょうか


「正規化」のおおまかな意味は、「一意の情報は一箇所に」です。

>id(連番)、日付、ユーザーID、ユーザーパス、お店の名前、お店の住所、電話番号、HPアドレス、お店の写真

例えば、この中で、同一の店情報を、複数のユーザーが2重3重に登録することになります。つまり、その分だけ、ファイルサイズが肥大化します。
よって、店情報は店tableとして分けて、お気に入りtableでは、店IDだけ持つのが効率よいと考えます。
また、ユーザーごとの個別情報(ユーザーパスなど)も、お気に入りの登録個数ぶん多重登録されたり、登録のたびにパス変更したりされると過去のデータはパスが違うので変更できないなど困ったことになります。
ので、ユーザー別情報tableを別に持って、ユーザーパスはこのtableで一意に管理する。
といったことが必要になるでしょう。

画像データの扱いは、保存スペースとの関係や利用方法によるでしょう。

1.画像ファイル名のみ保持して、実データは別領域に置く
利点:データベースのサイズは小さく押さえられる。php出力では、他のテキスト情報とともに、img src=""にファイル名を記述するだけで済む。初心者向けの管理方法である。
不利点:画像の場所やファイル名がデータベースと連動せずに変更される可能性がある。
自サイト内の画像用スペースにアップロードする形式なら行方不明にはならないと思うけど、一般公開サイトなら画像の著作権とか肖像権とか商標とかの方が問題かも。

2.データベース内に画像データを取り込み、blob型で保持:sql文はテキストなので、base64encodeして入れ込むことになる。
利点:行方不明にならない。
不利点:データベースのサイズは大きくなる。php出力時は画像のみ個別に取得して画像のみ出力するスクリプトが別に必要になる。よってかなり知識が必要になる。
著作権とか肖像権とか商標とかの問題は上記と同じ。

別tableにするかは、レコードごとの画像枚数との関係もあるでしょう。
また、正規化の観点で、画像1枚ごとに、店IDの他に、誰が撮ったか、どっちからみた写真なのかなどの画像別情報を保持するなら別table管理がよいでしょう。
    • good
    • 0
この回答へのお礼

詳細にありがとうございます!
よく分かりました。
正規化というのですね。疑問が解消されてすっきりです。
また、blobで保存とbase64encodeはデータベースへの格納方法が別だと思っていました。。
blob形に指定したmysqlテーブルにbase64encodeでテキスト化して入れるということですね。
とにかく色々といじってみます。
親切にありがとうございました。

お礼日時:2007/06/12 01:43

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!