具有用于多个产品图像的另一个表的优点


The advantage of having another table for multiple product images?

这是我的MySQL 中的产品表

CREATE TABLE IF NOT EXISTS `tbl_products` (
  `productId` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `productSku` varchar(6) COLLATE utf8_bin NOT NULL,
  `productName` varchar(75) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `productDescription` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `extraSpecification` text COLLATE utf8_bin,
  `productPrice` decimal(10,2) NOT NULL DEFAULT '0.00',
  `MRP` decimal(10,2) NOT NULL DEFAULT '0.00',
  `productImage` varchar(300) COLLATE utf8_bin NOT NULL,
  `pageTitle` varchar(75) COLLATE utf8_bin NOT NULL,
  `productKeywords` varchar(250) COLLATE utf8_bin NOT NULL,
  `metaDescription` varchar(250) COLLATE utf8_bin NOT NULL,
  `dateAdded` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `addedBy` varchar(300) COLLATE utf8_bin NOT NULL,
  PRIMARY KEY (`productId`),
  UNIQUE KEY `productName` (`productName`),
  FULLTEXT KEY `productName_2` (`productName`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=174 ;

你看,我有一个关于产品图像的专栏

  `productImage` varchar(300) COLLATE utf8_bin NOT NULL,

它将产品映像的路径保存在服务器上的文件夹"data"中,运行良好。

问题是,每个产品需要至少有三个图像。看到一些电子商务数据库结构,意识到它们中的大多数都有一个不同的表"product_images",用于存储每个产品的多个图像。

有人能给我解释一下这个概念吗?更重要的是,有另一张桌子的优势,以及我如何做到这一点。

有单独的表来存储产品图像的优点是可以在该表中存储N个图像。另一种解决方案是,您可以在一个字段中以逗号分隔的方式存储多个图像。这种方法有一个最大的缺点,因为您首先需要用逗号分隔数据,然后迭代数据。当您更新数据时,您首先需要从数据库中获取已经存储的字符串,然后用最新的字符串更新字符串,当您执行删除时,这种情况将是最糟糕的。对于删除,您将无法轻松更正需要删除的路径或图像。如果您正在存储路径,那么您需要执行许多字符串操作来删除它,并确保其他字符串部分不会受到伤害。每次更新或插入新图像时,都有可能丢失数据,因为您需要获取旧数据,然后添加新数据。因此,不同的表很容易处理更新或插入新值,您将有一个唯一的"id"可以使用,您可以轻松地执行插入、更新和删除。

使用同一个表的缺点是,每个图像都需要一列,因此您为最多三个图像创建三个新列(或使用逗号分隔的列表),然后客户端说他们想要4或5个图像,因此随着他们想要的图像数量的增加,您必须不断添加新列(或者增加现有列的长度)。。。。。使用单独的表可以在不进一步更改数据库结构或代码的情况下进行增长(在最初的支持工作之后)

如果要将同一个图像分配给多个产品,则需要一个用于图像的表,以及一个用于n-m分配的额外表。如果你的程序中有一个图像管理器,你可以单独上传和管理你的图像,这将是一种技术:

CREATE TABLE IF NOT EXISTS `tbl_image` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `productImage` varchar(300) COLLATE utf8_bin NOT NULL,
  PRIMARY KEY (id)
);
CREATE TABLE IF NOT EXISTS `tbl_products_images` (
  `productid` int(11) unsigned NOT NULL,
  `imageid` int(11) unsigned NOT NULL,
  PRIMARY KEY (productid, imageid),
  FOREIGN KEY (productid) REFERENCES tbl_products(productId) ON DELETE CASCADE,
  FOREIGN KEY (imageid) REFERENCES tbl_image(id) ON DELETE CASCADE
);

在表tbl_products_images中,您可以存储产品和相关图像的ID。

要获取产品的图像,您可以使用一个简单的连接:

SELECT productImage FROM tbl_image i INNER JOIN tbl_products_images pi ON pi.imageid=i.id WHERE pi.productid=33;

其中CCD_ 2是产品的id。

如果你有一个更简单的场景,上传的图像恰好属于一个产品,你只需要一个图像表:

CREATE TABLE IF NOT EXISTS `tbl_image` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `productImage` varchar(300) COLLATE utf8_bin NOT NULL,
  `productid` int(11) unsigned NOT NULL,
  PRIMARY KEY (id),
  FOREIGN KEY (productid) REFERENCES tbl_products(productId) ON DELETE CASCADE
);

使用此功能,您可以创建任意数量的图像,并使用productid属性将它们与产品关联。这就是获取id为33:的产品的图像的方法

SELECT productImage FROM tbl_image i WHERE productid=33;

使用表定义中的ON DELETE CASCADE,可以确保在删除相应产品时删除图像条目。