Php mysql中逗号分隔字段的更好选择

Php mysql中逗号分隔字段的更好选择,php,mysql,database,Php,Mysql,Database,在我的应用程序中,每当用户上传壁纸时,我都需要将该壁纸裁剪到 3种不同的大小,并将所有这些路径(3个路径用于裁剪图像,1个路径用于原始上传壁纸)存储到我的数据库中。 我还需要存储原始墙纸的锡箔纸(由用户上传) 在解决上述问题时,我提出了以下表格结构 CREATE TABLE `wallpapermaster` ( `wallpaperid` int(10) unsigned NOT NULL AUTO_INCREMENT, `userid` bigint(20) NOT NULL,

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

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

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
WallperLoc是一个逗号分隔的字段,由原始墙纸位置加上所有裁剪实例的位置组成


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

通常您使用固定位置(可能在配置之外)、固定扩展名(通常
jpg
)和特殊的文件名格式,如
[name]-1024x768.jpg
。这样你就只知道名字了

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
创建一个新表,该表将创建与“WallperMaster”表的关系


在主墙纸和位置表之间使用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;
wallparlocation
中的主键可确保同一位置不能插入两次


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

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

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

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

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

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

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


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

使用XML比逗号分隔的列表更具结构和可靠性。什么是“墙纸位置”?身份证?描述它来自哪里的文字?URL?墙纸位置指的是墙纸所在服务器上的路径。这不是很规范化(而且列名不应该用单引号括起来——如果是双引号或那些可怕的反勾号的话)。谢谢你的回答,我想问几个问题。你为什么选择InnoDB而不是myisam,如果我必须为一个特定大小的作物图像(540×320)指定TyyURL,那么我是否应该考虑将该列设为WalpCealPosil表(此后该列将包含大量的空值)。我无法想象现在还有什么理由继续使用MyISAM。tinyurl是属于某个位置还是属于壁纸?tinyurl属于某个位置(壁纸存储在服务器上)@Tarun:那么它应该进入壁纸位置。我不会担心空值。
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;