【问题标题】:The most efficient way to store photo reference in a database在数据库中存储照片参考的最有效方法
【发布时间】:2014-04-05 02:53:00
【问题描述】:

我目前正在寻找存储来自大约 100/200k 用户的大约 350 万张照片。我只在aws上使用mysql数据库。我的问题是关于存储照片参考的最有效方法。我只知道两种方法,我正在寻找专家意见。

选择A

具有 photo_url 列的用户表,在该列中,我将构建一个逗号分隔的照片列表,该列表既维护名称又保持排序顺序。业务逻辑将处理从照片名称中提取路径并附加照片大小。缺点是处理费用。

数据库示例

"0ea102, e435b9, etc" 

业务逻辑会根据照片名称构建以下网址

/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

有人对更好的解决方案有任何建议吗?

【问题讨论】:

  • @Christian Mark 我不是在问如何建立一个表格,我是在寻找基于上述两个选项的基准比较。我正在寻找最佳选择。
  • 好的。给定的。但是优化你的表可以优化你的查询。
  • @Christian Mark 这两种设计,你认为哪一种性能最好?
  • 请检查我的答案。

标签: mysql database architecture filesystems


【解决方案1】:

最好和最常见的答案是:选项 B - 与用户表连接的关系表,其中包含以下字段。

id
order
user_id
desc
photo_url_800
photo_url_150
photo_url_45
date_uploaded

混合,其中,您单独存储文件名并将照片目录添加到您的业务逻辑层。

我的分析,你的第一个选择是一个不好的做法。数据库不建议使用逗号分隔的字段。您很难更新这些字段并在其上添加描述。

关于表格优化,你可能想看看这些文章:

【讨论】:

  • 感谢 Christian,我使用的是 Hibernate ORM,所以我想我只是使用混合模型。我可能会像在选择 A“0ea102”中那样将照片名称存储到关系设计中,但是在 JPA 实体中添加一些方法调用,在其中我从照片名称“/0e/a1/02”构建 URL当我调用 getPhotoSize800() 方法时,附加大小“800”和扩展名给我“/0e/a1/02_800.jpg”。我可以将所有尺寸存储在目录 a1 中。我喜欢将它们放在关系表中的想法,因为它使照片清理工作更容易运行。想法?
  • 是的,没错。这样,您还将解决一些迁移问题。我体验过一次,效果很好。
  • 谢谢克里斯蒂安,看看我下面的帖子,你会看到我的混合模型。
【解决方案2】:

这是我使用休眠 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();
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-06
    • 2010-09-22
    • 1970-01-01
    • 2019-08-10
    • 2010-09-24
    • 2023-03-18
    • 1970-01-01
    相关资源
    最近更新 更多