テーブルの設計およびphpについて質問させていただきます。
現在画像つき掲示板を作成しています。
掲示板のスレッドは添付のようにしてみました。
※コメントはスレッドと別で管理します。
ここでimageのカラムにはアップした画像のパスを入れようと考えていたのですが、
アップした画像自体にthread_idをつけて保管することで、このimageのカラムは必要ない気がしてきました。(画像が保管されているフォルダからthread__idの名前があるデータがあるかどうかみるだけでよい気がしています)
※画像は必須ではありません。
ただ、どちらでもよい気がしていまして、
画像がなければ画像フォルダへのアクセスは減るかなというのもあれば、threadフィールドにimageのカラムはなくてもいいし、、、、という感じで自分の経験則から判断ができずにおります。
このような場合どうしたらよいでしょうか。
ご知見あるかたいらっしゃいましたらお知恵を拝借できればと思います。
どうぞよろしくお願いいたします。
動作するかどうかという点に関しては、どちらでもよいかと思います。
将来的なメンテナンスというか、拡張性の違いかなと思います。
例えばですが、次のような場合には、imageカラムがないと不便だと思います。
- 様々な画像フォーマットを扱いたい場合。拡張子を確認するためにimageカラムを見ると言う感じでしょうか。
- スレッドに複数の画像を付けられるようにしたい場合。<thread_id>-<番号>のような形で格納できるかもしれませんが、存在確認のパフォーマンスが問題になる可能性があります。
- スレッドには認証を付けて画像も非公開にしたい場合に、スレッドidから画像のURLが類推されることを防ぎたい場合。
- 画像ファイルが非常に多い場合。画像ファイルを全て1つのディレクトリに格納していくと、ext2とかext3などのファイルシステムでは、1ディレクトリ内のファイル数が多くなるとパフォーマンスが低下します。それを回避するためにサブディレクトリを切りたい場合は、thread_idからパスを決定することができないこともあるかもしれません。
- 画像を別サーバで管理したい場合。thread_idからURLを決定できても、ファイルの存在確認のパフォーマンスが問題となるので、imageカラムがあった方がいいでしょう。
このような問題点がないのであれば、imageカラムを導入しない方が、1つの事柄を1つの場所で管理できるのでよいかもしれません。
全て予見してシステムを作ることはできませんし、必要なときに必要なメンテナンスをしてあげればいいだけではありますが。
何かの参考になれば。
結論からいうと、どちらでも良いと思います。
DBに持たせずネーミングルールだけで行く場合、DBの負担が減りますので、サーバの動作を軽くできる可能性が高まります。
※画像が必要なところで都度DBを見に行く可能性がある。
逆にDBに持たせた場合のメリットとしては、例えば現状のネーミングルールを変更して「乱数」的な物ををファイル名に付与するなどの仕様変更を行った際、変更箇所が最小限ですむ可能性が高まります。
ちなみに、サーバが単一の場合はどちらでも良いのですが、
負荷分散のため複数サーバで運用をしたい、となるともう少し混みいったお話になるのですが、そこまで考えていらっしゃるのであれば、情報を追記していただければと。
#余談ですが、テーブル設計でバイト数が決まっている物は text ではなくvarchar(32) といった
#ように固定長の物を使った方がよいかと。