我正在尝试重构和规范 MySQL 中的产品表,如下所示:
CREATE TABLE `products` (
`id` varchar(45) NOT NULL, # alphanumeric product codes
`productCategory` varchar(45) NOT NULL,
`productSubCategory` varchar(45) DEFAULT NULL,
`productRange` varchar(45) NOT NULL,
`productClass` varchar(45) DEFAULT NULL,
`name` text NOT NULL,
`size` int(11) NOT NULL,
`sizeMeasure` varchar(5) NOT NULL,
`boxQuantity` int(11) NOT NULL,
`sellingPrice` double NOT NULL,
`rrp` double DEFAULT NULL,
`ordinalValue` int(11) NOT NULL,
PRIMARY KEY (`id`)
)
我认为需要重构的是productCategory
,productSubCategory
和productRange
字段。这样做的原因是我需要能够获得类别的层次结构。还计划将元数据添加到类别中。
表字段当前包含以下数据:
productCategory productSubCategory productRange
---------------------------------------------------------
retail retail_solution1 retail_solution1_range1
retail retail_solution2 retail_solution2_range2
retail retail_solution3 retail_solution3_range3
professional prof_solution1 prof_solution1_range1
professional prof_solution1 prof_solution1_range2
professional prof_solution1 prof_solution1_range3
professional prof_solution2 prof_solution2_range1
professional prof_solution2 prof_solution2_range2
professional prof_solution2 prof_solution2_range3
... ... ...
本质上,在productCategory
RETAIL 集中,productSubCategory
和productRange
字段具有相同的VARCHAR(45)
值。
这棵树的深度在未来极不可能发生变化。最常见的更改可能是类别名称。
我查看了邻接表和嵌套集模型,不知何故感觉更倾向于使用嵌套集模型。
到目前为止,我对嵌套集模型方法的了解是:
添加类别:
CREATE PROCEDURE `addCategory`(IN parent VARCHAR(45), IN child VARCHAR(45))
BEGIN
SELECT @myLeft := lft FROM product_category
WHERE name = parent LIMIT 1;
UPDATE product_category SET rgt = rgt + 2 WHERE rgt > @myLeft;
UPDATE product_category SET lft = lft + 2 WHERE lft > @myLeft;
INSERT INTO product_category(name, lft, rgt) VALUES(child, @myLeft + 1, @myLeft + 2);
END
删除类别:
CREATE PROCEDURE `deleteCategory`(IN name VARCHAR(45))
BEGIN
SELECT @myLeft := lft, @myRight := rgt, @myWidth := rgt - lft + 1
FROM product_category
WHERE name = name;
DELETE FROM product_category WHERE lft BETWEEN @myLeft AND @myRight;
UPDATE product_category SET rgt = rgt - @myWidth WHERE rgt > @myRight;
UPDATE product_category SET lft = lft - @myWidth WHERE lft > @myRight;
END
我想在 java web 应用程序中使用 sql,而不是存储过程。我正在使用 Spring 的JDBCTemplate
所有数据访问。目前我不确定如何处理这个问题,因为我之前没有使用过多语句查询JDBCTemplate
。
理想情况下,我还想使用 DBUnit 测试数据访问层。
让我对这个项目感到失望的是,不知何故,我觉得需要更加重视顶级类别。也许 RETAIL 和 PROFESSIONAL 的顶级类别应该是产品类型而不是类别?
任何指导将不胜感激。谢谢。