Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在数据库中存储照片引用的最有效方法_Mysql_Database_Architecture_Filesystems - Fatal编程技术网

Mysql 在数据库中存储照片引用的最有效方法

Mysql 在数据库中存储照片引用的最有效方法,mysql,database,architecture,filesystems,Mysql,Database,Architecture,Filesystems,我目前正在寻找存储大约100/20万用户的350万张照片。我只在aws上使用mysql数据库。我的问题是关于存储照片参考的最有效方法。我只知道两种方法,我正在寻找专家意见 选择A 一个带有photo_url列的用户表,在该列中,我将构建一个以逗号分隔的photo列表,该列表同时维护名称和排序顺序。业务逻辑将处理从照片名称中提取路径并附加照片大小。缺点是处理费用 数据库示例 "0ea102, e435b9, etc" 业务逻辑将从照片名称构建以下URL /0e/a1/02.jpg /0e/a1

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

选择A

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

数据库示例

"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

有人对更好的解决方案有什么建议吗?

最好也是最常见的答案是:选择B-在用户表上加入关系表,并带有以下字段

id
order
user_id
desc
photo_url_800
photo_url_150
photo_url_45
date_uploaded
或者一个混合的,其中,您单独存储文件名,并使用业务逻辑层添加照片目录

我的分析是,你的第一个选择是一个坏习惯。数据库不建议使用逗号分隔的字段。您很难更新这些字段并在其上添加说明

关于表优化,您可能希望看到以下文章:


    • 下面是我使用hibernate 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();
          }
      
      }
      

      可能重复@Christian Mark我不是在问如何建立一个表,我在寻找基于上述两个选项的基准点比较。我在找最好的选择。鉴于但是优化表可以优化查询。@Christian Mark在这两种设计中,你认为哪一种性能最好?请检查我的答案。谢谢Christian,我使用Hibernate ORM,因此我想我只使用混合模型。我可能只是将照片名称存储在关系设计中,就像我在选项A“0ea102”中所做的那样,但是在JPA实体中添加一些方法调用,在这里我根据照片名称“/0e/a1/02”append size“800”构建URL,当我调用方法getPhotoSize800()时,扩展名为“/0e/a1/02_800.jpg”。我可以把所有的尺寸都存储在目录a1中。我喜欢将它们放在关系表中的想法,因为这样会使照片清理工作更容易运行。想法?是的,没错。这样,您还可以解决一些迁移问题。我曾经体验过一次,效果很好。谢谢Christian,请看我下面的帖子,你会看到我的混合动力车型。