为多个产品图像使用另一个 table 的优势是什么?
The advantage of having another table for multiple product images?
这是我MySQL
中的产品table
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' 中并且工作正常。
问题,每个产品至少需要三张图片。看到了一些电子商务数据库结构,并意识到它们中的大多数都有不同的 table 'product_images' 用于为每个产品存储多个图像。
有人可以向我解释这个概念,更重要的是 优势 完全拥有另一个 table 以及我如何才能完成它。
如果您想将同一张图片分配给多个产品,您需要为图片分配一个 table,并为 n-m 分配额外的 table。如果您的程序中有图像管理器,您可以在其中单独上传和管理图像,这将是一种技术:
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
);
在 table 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;
... 其中 33
是产品的 ID。
如果您有一个更简单的场景,其中上传的图片恰好属于一个产品,您只需要一张图片 table:
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;
使用 table 定义中的 ON DELETE CASCADE
,您可以确保在删除相应产品时删除图像条目。
单独 table 存储产品图像的优势是您可以在 table 中存储 N 个图像。另一种解决方案是您可以在一个字段中以逗号分隔的方式存储多个图像。这种方法有一个最大的缺点,因为您首先需要用逗号分隔数据,然后迭代数据。当你更新数据时,你首先需要从数据库中获取已经存储的字符串,然后用最新的更新字符串,这种情况在你执行删除时最糟糕。对于删除,您将无法轻松纠正哪个路径或图像需要 remove.If 您正在存储路径,然后您需要执行许多字符串操作以将其删除并确保其他字符串部分不会受到伤害。更新或插入新图像时可能会丢失数据,因为每次您需要获取旧数据然后附加新数据。如此不同的 table 很容易处理更新或插入新值,你将有一个独特的 "id" 可以玩,你可以轻松地执行插入、更新、删除。
使用相同 table 的缺点是每个图像都需要一个列,因此您最多为三个图像创建三个新列(或使用逗号分隔列表),然后客户端说他们想要 4 或 5 张图片,因此随着他们想要的图片数量的增加,您不得不不断添加新列(或增加现有列的长度)......使用单独的 table 允许在不进一步更改数据库结构或代码的情况下实现增长(在支持它的初始工作之后)
这是我MySQL
中的产品tableCREATE 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' 中并且工作正常。
问题,每个产品至少需要三张图片。看到了一些电子商务数据库结构,并意识到它们中的大多数都有不同的 table 'product_images' 用于为每个产品存储多个图像。
有人可以向我解释这个概念,更重要的是 优势 完全拥有另一个 table 以及我如何才能完成它。
如果您想将同一张图片分配给多个产品,您需要为图片分配一个 table,并为 n-m 分配额外的 table。如果您的程序中有图像管理器,您可以在其中单独上传和管理图像,这将是一种技术:
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
);
在 table 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;
... 其中 33
是产品的 ID。
如果您有一个更简单的场景,其中上传的图片恰好属于一个产品,您只需要一张图片 table:
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;
使用 table 定义中的 ON DELETE CASCADE
,您可以确保在删除相应产品时删除图像条目。
单独 table 存储产品图像的优势是您可以在 table 中存储 N 个图像。另一种解决方案是您可以在一个字段中以逗号分隔的方式存储多个图像。这种方法有一个最大的缺点,因为您首先需要用逗号分隔数据,然后迭代数据。当你更新数据时,你首先需要从数据库中获取已经存储的字符串,然后用最新的更新字符串,这种情况在你执行删除时最糟糕。对于删除,您将无法轻松纠正哪个路径或图像需要 remove.If 您正在存储路径,然后您需要执行许多字符串操作以将其删除并确保其他字符串部分不会受到伤害。更新或插入新图像时可能会丢失数据,因为每次您需要获取旧数据然后附加新数据。如此不同的 table 很容易处理更新或插入新值,你将有一个独特的 "id" 可以玩,你可以轻松地执行插入、更新、删除。
使用相同 table 的缺点是每个图像都需要一个列,因此您最多为三个图像创建三个新列(或使用逗号分隔列表),然后客户端说他们想要 4 或 5 张图片,因此随着他们想要的图片数量的增加,您不得不不断添加新列(或增加现有列的长度)......使用单独的 table 允许在不进一步更改数据库结构或代码的情况下实现增长(在支持它的初始工作之后)