3

在我的应用程序中,每当用户上传壁纸时,我都需要将该壁纸裁剪成 3 种不同的尺寸并将所有这些路径(裁剪图像的 3 个路径和原始上传壁纸的 1 个路径)存储到我的数据库中。
我还需要存储原始壁纸的 tinyurl(由用户上传)。

在解决上述问题时,我提出了以下表格结构。

CREATE TABLE `wallpapermaster` (
  `wallpaperid` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `userid` bigint(20) NOT NULL,
  `wallpaperloc` varchar(100) NOT NULL,
  `wallpapertitle` varchar(50) NOT NULL,
  `wallpaperstatus` tinyint(4) DEFAULT '0' COMMENT '0-Waiting,1-approved,2-disapproved',
  `tinyurl` varchar(40) NOT NULL
) ENGINE=MyISAM

wallpaperloc 是一个逗号分隔的字段,由原始壁纸位置和所有裁剪实例的位置组成。

我知道使用逗号分隔字段在关系数据库领域被认为是一种糟糕的设计,所以您想提出一些其他简洁有效的方法吗?

4

5 回答 5

4

在 wallpapermaster 和位置表之间使用 1:n 关系。

像这样的东西:

CREATE TABLE wallpapermaster (
  wallpaperid     int unsigned NOT NULL AUTO_INCREMENT,
  userid          bigint NOT NULL,
  wallpaperloc    varchar(100) NOT NULL,
  wallpapertitle  varchar(50) NOT NULL,
  wallpaperstatus tinyint DEFAULT '0' COMMENT '0-Waiting,1-approved,2-disapproved',
  primary key (wallpaperid)
) ENGINE=InnoDB;


CREATE TABLE wallpaperlocation (
  wallpaperid  int unsigned NOT NULL,
  location     varchar(100) NOT NULL,
  tinyurl      varchar(40),
  constraint fk_loc_wp 
      foreign key (wallpaperid) 
      references wallpapermaster (wallpaperid),
   primary key (wallpaperid, location)
) ENGINE=InnoDB;

主键 inwallpaperlocation保证同一个位置不能被插入两次。

请注意,int(10)没有定义任何数据类型约束。它只是提示客户端应用程序指示该数字有多少位。

于 2013-01-11T10:26:48.983 回答
1

通常您使用固定位置(可能不在配置中)、修复扩展名(通常jpg)和特殊文件名格式,例如[name]-1024x768.jpg. 这样你只有名字

于 2013-01-11T10:22:21.523 回答
1

在我看来,即使在关系数据库中使用;,简单的应用程序中也是非常好的解决方案。

您应该适当考虑拆分图像的数量。如果壁纸少于 5 张,我不会采用开销复杂的解决方案。

  • 在数据库和应用程序中易于维护。您将使用字符串splitting/joining方法
  • 无需添加用于检索值的额外join
  • 使用简单的varchar相当xml更好,因为您不必依赖应用程序数据库访问引擎。当您使用ORMJDBC时,您需要做额外的工作来处理更复杂的数据类型。

在更复杂的系统中,我会制作XML专栏。

于 2013-01-11T10:27:19.800 回答
1

虽然缩略图是从单个上传的文件自动生成的,但您根本不需要存储裁剪/调整大小文件的路径。

相反,您可以只使用标准化的文件名作为缩略图,然后在文件系统中找到它们——KingCrunch 建议:photo1.jpgphoto1-medium.jpg

无论如何,我的 2cc:为了避免使用一些收割机遍历您的图像库(和创建的缩略图),即使仅使用 MD5 + 一些以编程方式的密钥加密每个缩略图的名称也是一个好主意,因此只有知道密钥的程序才能创建正确的基于原始名称/路径的缩略图路径。对于其他客户端,命名顺序将是随机的。

于 2013-01-14T22:22:25.763 回答
0
CREATE TABLE `wallpapermaster` (
  `wallpaperid` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `userid` bigint(20) NOT NULL,
  `wallpapertitle` varchar(50) NOT NULL,
  `wallpaperstatus` tinyint(4) DEFAULT '0' COMMENT '0-Waiting,1-approved,2-disapproved',
  `tinyurl` varchar(40) NOT NULL
) ENGINE=MyISAM

创建一个新表,它将与“wallpapermaster”表建立关系

create wallpapermaster_mapper( 
    `id` unsigned NOT NULL AUTO_INCREMENT,
    `wallpapermaster_id` int(10) //this will be foreign key with id of wallpapermaster table
    `wallpaper_path1`  varchar(100) NOT NULL,
    `wallpaper_path2`  varchar(100) NOT NULL,
    `wallpaper_path3`  varchar(100) NOT NULL,
    )
于 2013-01-11T10:24:57.647 回答