PHPとMySQLを勉強中です。
データベースと連携させた「お気に入りのお店」を登録するような地図サイトを作ろうと思っているのですが、テーブル設計について疑問ですので、よろしければ教えてください。
ちなみにMySQLへ登録する項目は、
id(連番)、日付、ユーザーID、ユーザーパス、お店の名前、お店の住所、電話番号、HPアドレス、お店の写真 などを考えています。
1、効率のいいテーブルの設計とはどのようなものでしょう?
素人考えでは、一括で管理したほうがよさそうだと思うのです。
ですが、他の方のスクリプトをダウンロードして見てみると、ほとんどテーブルが分割されていることが多いです。
どのような意図なのでしょう??
2、バイナリデータはbase64でテキストにしたほうがいいと本に書いてありましたが、テーブルも別にしたほうがいいのでしょうか?
3、このような内容について、詳しい本などがありましたらぜひ教えてください。負荷分散とかバックアップなどについても勉強しようと思っています。
結局は、どのような使われ方をするかで設計が変わってくるような気がしますが、何分、勉強し始めたばかりでよく分かっていません。。
お手すきのときに教えてください。
よろしくお願いいたします。
No.1ベストアンサー
- 回答日時:
効率のよい:「正規化されてる」でしょうか
「正規化」のおおまかな意味は、「一意の情報は一箇所に」です。
>id(連番)、日付、ユーザーID、ユーザーパス、お店の名前、お店の住所、電話番号、HPアドレス、お店の写真
例えば、この中で、同一の店情報を、複数のユーザーが2重3重に登録することになります。つまり、その分だけ、ファイルサイズが肥大化します。
よって、店情報は店tableとして分けて、お気に入りtableでは、店IDだけ持つのが効率よいと考えます。
また、ユーザーごとの個別情報(ユーザーパスなど)も、お気に入りの登録個数ぶん多重登録されたり、登録のたびにパス変更したりされると過去のデータはパスが違うので変更できないなど困ったことになります。
ので、ユーザー別情報tableを別に持って、ユーザーパスはこのtableで一意に管理する。
といったことが必要になるでしょう。
画像データの扱いは、保存スペースとの関係や利用方法によるでしょう。
1.画像ファイル名のみ保持して、実データは別領域に置く
利点:データベースのサイズは小さく押さえられる。php出力では、他のテキスト情報とともに、img src=""にファイル名を記述するだけで済む。初心者向けの管理方法である。
不利点:画像の場所やファイル名がデータベースと連動せずに変更される可能性がある。
自サイト内の画像用スペースにアップロードする形式なら行方不明にはならないと思うけど、一般公開サイトなら画像の著作権とか肖像権とか商標とかの方が問題かも。
2.データベース内に画像データを取り込み、blob型で保持:sql文はテキストなので、base64encodeして入れ込むことになる。
利点:行方不明にならない。
不利点:データベースのサイズは大きくなる。php出力時は画像のみ個別に取得して画像のみ出力するスクリプトが別に必要になる。よってかなり知識が必要になる。
著作権とか肖像権とか商標とかの問題は上記と同じ。
別tableにするかは、レコードごとの画像枚数との関係もあるでしょう。
また、正規化の観点で、画像1枚ごとに、店IDの他に、誰が撮ったか、どっちからみた写真なのかなどの画像別情報を保持するなら別table管理がよいでしょう。
詳細にありがとうございます!
よく分かりました。
正規化というのですね。疑問が解消されてすっきりです。
また、blobで保存とbase64encodeはデータベースへの格納方法が別だと思っていました。。
blob形に指定したmysqlテーブルにbase64encodeでテキスト化して入れるということですね。
とにかく色々といじってみます。
親切にありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- MySQL PHPとMySQLを使った掲示板の作り方 1 2022/06/02 13:00
- SQL Server DBのテーブルの設計ができず困っています。 2 2023/06/29 16:43
- その他(データベース) pythonでsqlight勉強中、クエリー結果の利用法教えて下さい 1 2022/04/28 20:38
- MySQL [1000地域 × 10カテゴリー = 1万件のテーブル]!グループ化? 1 2023/06/14 23:56
- Access(アクセス) Access クエリ 同一テーブル内 複数フィールドの同時集計のやり方について 1 2022/05/18 19:01
- MySQL 【投稿情報用データベース posts】は必要ないと思います。 1 2022/06/02 21:25
- その他(データベース) accessについて 2 2022/05/31 16:58
- Access(アクセス) Accessテーブルの結合で別々のテーブルのフィールドを組み合わせて値を出す方法について 2 2022/07/20 19:43
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- Ruby pandasでsqlite3にテーブル作成・追加・読み出しでindexの取り扱い方教えてください 5 2023/03/08 09:57
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
mysqlでJOIN文
-
一つ前に戻るには…
-
ビューに追加・削除が出来ません。
-
SQL一発でカレンダー表示は可能...
-
mysqlで外部キーをつけたカラム...
-
fetch_arrayでのエラー
-
Accessでデータシートに同じデ...
-
テーブル名をカラムとして取得...
-
会社の飲み会の幹事になり、座...
-
L2SWはARPテーブルを持っている?
-
SQL、2つのテーブルで条件一致...
-
update文で改行を入れる
-
SELECT 文の NULL列は?
-
カラム位置変更
-
SQL*LoaderでCSVから指定した列...
-
他のデータベースとのテーブル結合
-
Oracleで上書きImportはできま...
-
ビューのソートについて
-
Accessのテーブルデータを一気...
-
SQLにて指定日付より前、かつ最...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
一つ前に戻るには…
-
mysqlのフィールド名
-
最大値を持つレコードを削除したい
-
mysqlでJOIN文
-
1列について重複行を除いて全列...
-
グループからランダムに抽出す...
-
mysqlで外部キーをつけたカラム...
-
SQL一発でカレンダー表示は可能...
-
矛盾していないでしょうか?
-
ビューに追加・削除が出来ません。
-
1000万件のデータをmysqlで効率...
-
テーブルが作成できない
-
挿入先テーブルに存在しないレ...
-
【ストアドプロシージャ】条件...
-
SQL内でループさせるような検索文
-
MySQL INSERT文 エラー
-
mysqlのデータベースを復元した...
-
Waiting for table lockエラー...
-
PHP上のSQLで、SELECT文をいく...
-
複数の列にまたがってユニーク...
おすすめ情報