アップロードした画像を、ユーザー側で任意に表示順を指定でき、その表示順のデータをDB(MySQL)に保存させたいのですが、テーブル設計に悩んでいます。


単純に画像毎に表示番号のカラムをつけ、1から番号を割り振るのも、あまりスマートなやり方ではないし、画像の順番が変更になった時にいろいろ面倒だと思うので、もし他によいやり方や、参考になるものがありましたら教えて下さい。

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2011/09/30 19:18:40
  • 終了:2011/10/04 16:41:01

回答(3件)

id:taknt No.1

きゃづみぃ回答回数13539ベストアンサー獲得回数11982011/09/30 19:45:18

ポイント34pt

どっちにしろ表示順の項目を作らないとダメですね。

どの順番で表示させるのか指定する必要がありますから。

どのようにして画像を表示させるのかは わかりませんが それのための情報も

必要な感じがしますね。

id:xxmasaxx

コメントに記載しましたので、よろしければご参考下さい。

よろしくお願いします。

2011/10/01 13:57:36
id:Jupiter2100 No.2

じゅぴたー回答回数444ベストアンサー獲得回数742011/09/30 20:34:31

ポイント33pt

画像データは、BLOB型を使ってDBに保存するのではなく、ファイルとして保存することを前提に、下記のようなレコード構造にするといいでしょう。

画像ID画像種別(拡張子)並び順画像名

画像IDはアップロード時に決定するユニークな記号番号で、一度登録したら変更できないようにします。画像ファイル名(拡張子を除く)としても使います。DBキーにすることもできます。

「ユーザーID+年月日時分秒」や「画像ファイル名のハッシュ値(MD5関数など)」を用いるといいでしょう。


画像種別は、画像ファイルの拡張子(JPG, PNG等々)です。これも一度登録したら変更できないようにします。


並び順は、ユーザーが指定した画像の並び順を記録するもので、1から順番に数値を与えるようにしておけばいいでしょう。ユーザーによる変更が可能なカラムです。ただし数値が重複しないようにコントロールしてやる必要があります。


画像名は、ユーザーが画像の並び替えをする時に参照する名前で、ユーザーが自由に付けたり変更したりできるものとします。画像IDだけではユーザーには分かりにくいと思うので、あくまで補助的に使う名前なので、重複可とします。


必要なら、これ以外にタイムスタンプ、画像サイズなどのカラムも追加しておくといいでしょう。

id:xxmasaxx

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

参考にさせていただきます。

2011/10/01 13:59:29
id:okamotoy No.3

okamotoy回答回数116ベストアンサー獲得回数132011/09/30 22:50:26

ポイント33pt

 「任意に」の内容が決まっていないのなら,

    • ファイルA:画像ファイルのパス一覧
    • ファイルB:「『並べ替えプログラムのパス』と『並べ替え結果を出力するファイルのパス』」対応一覧

でいかがでしょう.(RDB要らずです.)

 ファイルBを参照して使いたいプログラムを選択すれば並べ替えが実行され,出力したファイルを参照して表示するようにすれば良いのです.

 「任意に」の内容が決まった段階で「並べ替えプログラム」を書き,ファイルBに追加していきます.

 「各『並べ替えプログラム』が出力するファイル」は「表示したい順にファイルパスを並べる」だけに統一します.

 そうすることにより,表示プログラムも統一できます.

id:xxmasaxx

残念ながら今回はDBが必須なのでそのままではできませんが、

参考にさせていただきます。回答ありがとうございます。

2011/10/01 14:02:38
  • id:hysr
    >画像の順番が変更になった時にいろいろ面倒だと思うので、


    具体的にどのような点が面倒だと思うのでしょうか?
    今回の質問においては、この内容がキーになるかと思います。
    なので、この点を明示してもらえれば、皆さんも回答しやすくなるかと思います。
  • id:xxmasaxx
    失礼しました。

    画像がN個あり、表示順の優先番号を画像毎に1からNまで連番でそれぞれ割り振り、
    番号が小さい順から表示させる方法だと、仮に10個の画像の順番を変更した時、DB側の処理で順序を書き換えるのに10回UPDATEが発生します。

    この処理をなくす、あるいは回数の減らすやり方があればお願いしたいと思っています。

    ■DBのテーブル例

    画像名 表示順
    ---
    image1 3
    image2 1
    image3 2
    :
    ---
    表示は image2→image3→image1 となる。
  • id:okamotoy
     「順番を変更」する「基準が明確でない」と,どのように処理を工夫すればよいか解りませんですよ.
     「なぜ順番が変わるのか」を書くと良いと思います.
  • id:Jupiter2100
    >DB側の処理で順序を書き換えるのに10回UPDATEが発生します。
    処理負荷を懸念しているなら、順序ファイルはテキストファイル(例:CSVファイル)に持たせておいてはどうでしょう。
    順序情報を検索する必要はないでしょうし、頻繁に書き換えるものでは無いでしょうから。
  • id:xxmasaxx
    >「なぜ順番が変わるのか」を書くと良いと思います.

    アップロードされた画像を指定した順に表示する必要があるためです。
    スライドショー的なもの、と言えばよいのでしょうか。

    >処理負荷を懸念しているなら、順序ファイルはテキストファイル(例:CSVファイル)に持たせておいてはどうでしょう。

    不特定多数の人がいじるので、ファイル単位でやるのはロックの競合で消失する可能性があるのでなるべく避けたいのです。

    勿論、表示順の一覧をテキストデータにまとめてDBに保存する方法もアリだと思います。



  • id:Jupiter2100
    >不特定多数の人がいじるので、ファイル単位でやるのはロックの競合で
    >消失する可能性があるのでなるべく避けたいのです。

    ユーザー毎に順番ファイルを用意するので、問題は無いと思います。そもそもロックの競合が起きるとしたら、プログラムの方に問題があります。

    画像順序を変更できるのはその画像をアップロードしたユーザーだけということを想定しているのですが、間違っていますか?
  • id:okamotoy
    >アップロードされた画像を指定した順に表示する必要があるためです。

     はい.
     では,順番の指定方法を明らかにしましょう.
     たとえば,10個の画像があるとして
      --表示順を1から10まで番号を明示的に入れていく
      --「新しい順」「大きい順」のように明確な有限の選択条件を設ける
    のような方法が考えられます.

     前者の場合であれば,入力情報が変わったものだけをRDBに反映すればよいです.
      (処理の工夫は不要に思います. 全順番が変われば全部の変更が必要ですし.)
     後者であれば,画像登録の際に順序が明確に決まりますから,RDBの順序更新は登録のタイミングになり,表示させる際(読み出しの際)にRDBを更新することは無いと思います.

    >不特定多数の人がいじるので、ファイル単位でやるのはロックの競合で消失する可能性がある

     前者の場合はユーザ毎管理,場合によりセション毎管理が要りますねぇ.
     こちらのほうが面倒なのではないかと...

     後者であれば(読み出しだけなので)そのような管理は不要です(たぶん).
  • id:xxmasaxx
    遅れましたが、コメントありがとうございました。

    先に要件定義をちゃんしていればよかったですね、後出しですいません。
    頂いたアイデアを元に色々考えてみることにします。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません