更好的替代逗号分隔字段在mysql


Better alternative for comma separated field in mysql

在我的应用程序中,每当用户上传壁纸时,我需要将该壁纸裁剪成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是一个逗号分隔的字段,由原始墙纸位置加上所有裁剪实例的位置组成。

我知道使用逗号分隔字段被认为是一个坏的设计在关系数据库的世界,所以你想建议一些其他整洁和有效的方法吗?

在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;

wallpaperlocation中的主键确保同一个位置不能被插入两次。

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

通常你使用一个固定的位置(可能在配置之外),固定扩展(通常是jpg)和一个特殊的文件名格式,如[name]-1024x768.jpg。这样你就只需要使用

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

你应该考虑分割图像的数量。如果壁纸少于5张,我就不会使用复杂的解决方案。

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

在更复杂的系统中,我会使XML

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

相反,你可以使用规范化的文件名缩略图,然后在文件系统中找到它们——KingCrunch建议:photo1.jpg, photo1-medium.jpg等。

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

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,
    )