2

現在、約 100/200k のユーザーから約 350 万枚の写真を保存しようとしています。私はawsでmysqlデータベースのみを使用しています。私の質問は、写真参照を保存する最も効率的な方法に関するものです。私は2つの方法しか認識しておらず、専門家の意見を探しています.

選択肢A

photo_url 列を持つユーザー テーブル。その列で、名前と並べ替え順序の両方を維持する写真のカンマ区切りのリストを作成します。ビジネス ロジックは、写真の名前からパスを抽出し、写真のサイズを追加します。デメリットは処理費用です。

データベースの例

"0ea102, e435b9, etc" 

ビジネス ロジックは、写真の名前から次の URL を作成します。

/0e/a1/02.jpg
/0e/a1/02_thumb.jpg 
/e4/35/b9.jpg
/e4/35/b9_thumb.jpg 

選択肢 B - 次のフィールドを持つユーザー テーブルに結合されたリレーショナル テーブル。データベースのパフォーマンスに潜在的な問題があるのではないかと心配しています。

pk
user_id
photo_url_800
photo_url_150
photo_url_45
order

より良い解決策について何か提案はありますか?

4

2 に答える 2

1

これは、休止状態の ORM、Christian Mark、およびハイブリッド ソリューションを使用した最終的なソリューションの例です。

@Entity
public class Photo extends StatefulEntity {

    private static final String FILE_EXTENSION_JPEG = ".jpg";
    private static final String ROOT_PHOTO_URL = "/photo/";
    private static final String PHOTO_SIZE_800 = "_800";
    private static final String PHOTO_SIZE_150 = "_150";
    private static final String PHOTO_SIZE_100 = "_100";
    private static final String PHOTO_SIZE_50 = "_50";   

    @ManyToOne
    @JoinColumn(name = "profile_id", nullable = false)
    private Profile profile;

    //Example "a1d2b0" which will later get parsed into "/photo/a1/d2/b0_size.jpg"
    //using the generatePhotoUrl business logic below. 
    @Column(nullable = false, length = 6)
    private String fileName;

    private boolean temp;

    @Column(nullable = false)
    private int orderBy;

    @Temporal(TemporalType.TIMESTAMP)
    private Date dateUploaded;

    public Profile getProfile() {
        return profile;
    }

    public void setProfile(Profile profile) {
        this.profile = profile;
    }

    public String getFileName() {
        return fileName;
    }

    public void setFileName(String fileName) {
        this.fileName = fileName;
    }

    public Date getDateUploaded() {
        return dateUploaded;
    }

    public void setDateUploaded(Date dateUploaded) {
        this.dateUploaded = dateUploaded;
    }

    public boolean isTemp() {
        return temp;
    }

    public void setTemp(boolean temp) {
        this.temp = temp;
    }

    public int getOrderBy() {
        return orderBy;
    }

    public void setOrderBy(int orderBy) {
        this.orderBy = orderBy;
    }

    public String getPhotoSize800() {
        return generatePhotoURL(PHOTO_SIZE_800);
    }

    public String getPhotoSize150() {
        return generatePhotoURL(PHOTO_SIZE_150);
    }

    public String getPhotoSize100() {
        return generatePhotoURL(PHOTO_SIZE_100);
    }

    public String getPhotoSize50() {
        return generatePhotoURL(PHOTO_SIZE_50);
    }

    private String generatePhotoURL(String photoSize) {
        String firstDir = getFileName().substring(0, 2);
        String secondDir = getFileName().substring(2, 4);
        String photoName = getFileName().substring(4, 6);

        StringBuilder sb = new StringBuilder();
        sb.append(ROOT_PHOTO_URL);
        sb.append("/");
        sb.append(firstDir);
        sb.append("/");
        sb.append(secondDir);
        sb.append("/");
        sb.append(photoName);
        sb.append(photoSize);
        sb.append(FILE_EXTENSION_JPEG);
        return sb.toString();
    }

}
于 2013-10-04T03:46:55.697 に答える