mysql中逗号分隔字段的更好替代方案

时间:2013-01-11 10:18:56

标签: php mysql database

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

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

5 个答案:

答案 0 :(得分: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;

wallpaperlocation中的主键可确保无法插入相同的位置两次。

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

你应该考虑分割图像的数量。如果将有少于5个壁纸我不会采用高架复杂的解决方案。

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

在更多复杂系统中,我会XML列。

答案 3 :(得分:1)

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

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

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

答案 4 :(得分: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,
    )