以下のような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
ただし、ストアドプロシージャではなく、SQLをJava Webアプリに入れたいと思います。JDBCTemplate
すべてのデータ アクセスにSpring を使用しています。これまでマルチステートメントクエリを使用したことがないため、これにどのようにアプローチするかは現時点ではよくわかりませんJDBCTemplate
。
理想的には、DBUnit を使用してデータ アクセス層もテストしたいと考えています。
このプロジェクトで私をうんざりさせているのは、どういうわけかトップレベルのカテゴリをもっと重要視する必要があると感じていることです. おそらく、RETAIL と PROFESSIONAL のトップ レベル カテゴリは、カテゴリではなく製品タイプにする必要がありますか?
ガイダンスをいただければ幸いです。ありがとう。