Php mysql中逗号分隔字段的更好选择
在我的应用程序中,每当用户上传壁纸时,我都需要将该壁纸裁剪到 3种不同的大小,并将所有这些路径(3个路径用于裁剪图像,1个路径用于原始上传壁纸)存储到我的数据库中。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,
我还需要存储原始墙纸的锡箔纸(由用户上传) 在解决上述问题时,我提出了以下表格结构
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
更好,因为您不必依赖于应用程序数据库访问引擎。当您使用ORM或JDBC时,您需要做额外的工作来处理更复杂的数据类型
在更复杂的系统中,我会制作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;