一个带存储过程的无限级分类数据库设计

数据库保存分类信息的表命名为:cate,其结构和测试用的记录分别如1.jpg2.jpg 
-- ---------------------------- 
-- Table structure for cate 
-- ---------------------------- 
CREATE TABLE `cate` ( 
`id` int(5) NOT NULL auto_increment, 
`name` char(255) NOT NULL, 
`parent_id` int(4) NOT NULL, 
`nocontext` tinyint(1) NOT NULL, 
`path` char(255) NOT NULL default '0', 
`admin_id` tinyint(2) NOT NULL, 
`editor_id` tinyint(2) NOT NULL, 
`view` char(255) NOT NULL, 
PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=gbk;

 一个带存储过程的无限级分类数据库设计

1.jpg

 

一个带存储过程的无限级分类数据库设计

2.jpg

1、新增分类: 
-- ---------------------------- 
-- Procedure structure for cate_insert 
-- ---------------------------- 
DELIMITER ;; 
CREATE DEFINER=`root`@`localhost` PROCEDURE `cate_insert`(_name CHAR(255), _parent_id INTEGER(4), _nocontext TINYINT(1), _admin_id TINYINT(2),_editor_id TINYINT(2),_view CHAR(255)) 
BEGIN 
DECLARE X_max_id int default 0; 
DECLARE X_parent_path char(255); 
DECLARE X_path char(255); 
select max(id) from cate into X_max_id ; 
IF _parent_id!=0 THEN 
select `path` from `cate` where `id`= _parent_id  into X_parent_path; 
    SET X_path=CONCAT(X_parent_path,',',(X_max_id+1)); 
ELSE 
    SET X_path=X_max_id+1; 
END IF; 
INSERT INTO `cate` ( `name`, `parent_id`, `nocontext`, `path`, `admin_id`, `editor_id`, `view`)  VALUES  ( _name, _parent_id, _nocontext,X_path, _admin_id, _editor_id, _view); 
END;; 
DELIMITER ;

 

 

2、编辑分类 
-- ---------------------------- 
-- Procedure structure for cate_update 
-- ---------------------------- 
DELIMITER ;; 
CREATE DEFINER=`root`@`localhost` PROCEDURE `cate_update`(_id TINYINT(5),_name CHAR(255), _parent_id INTEGER(4), _nocontext TINYINT(1), _admin_id TINYINT(2),_editor_id TINYINT(2),_view CHAR(255)) 
BEGIN 
DECLARE X_parent_path char(255); 
DECLARE X_path_old char(255); 
DECLARE X_path_new char(255); 
DECLARE X_parent_id_old INT; 
SELECT `path` from `cate` WHERE `id`=_id into  X_path_old; 
IF _parent_id!=0 THEN 
    select `path` from `cate` where `id`= _parent_id  into X_parent_path; 
    SET X_path_new = CONCAT(X_parent_path,',',_id); 
ELSE 
    SET X_path_new = _id; 
END IF; 
UPDATE `cate`  set  `name`=_name, `parent_id`=_parent_id, `nocontext`=_nocontext, `admin_id`=_admin_id, `editor_id`=_editor_id, `view`=_view WHERE `id`=_id; 
UPDATE `cate` set `path`=REPLACE(`path`,X_path_old,X_path_new) ; 
END;; 
DELIMITER ;

 

 

3、取出所有分类 
-- ---------------------------- 
-- Procedure structure for cate_selectAll 
-- ---------------------------- 
DELIMITER ;; 
CREATE DEFINER=`root`@`localhost` PROCEDURE `cate_selectAll`() 
BEGIN 
SELECT * FROM `cate` ORDER BY `path`; 
END;; 
DELIMITER ;

 

 

4、得到一个分类的路径 
-- ---------------------------- 
-- Procedure structure for cate_getRoute 
-- ---------------------------- 
DELIMITER ;; 
CREATE DEFINER=`root`@`localhost` PROCEDURE `cate_getRoute`(_id INTEGER(5)) 
BEGIN 
DECLARE x_path char(255); 
select `path` from `cate` where `id`=_id  into x_path; 
select * from `cate` where FIND_IN_SET(`id`,x_path)  order by `path`; 
END;; 
DELIMITER ;

 

 

5、取出同一级分类 
-- ---------------------------- 
-- Procedure structure for cate_getBrother 
-- ---------------------------- 
DELIMITER ;; 
CREATE DEFINER=`root`@`localhost` PROCEDURE `cate_getBrother`(_id INTEGER(5)) 
BEGIN 
SELECT * FROM `cate` WHERE `parent_id`=(select `parent_id` from `cate` where `id`=_id ) order by `path`; 
END;; 
DELIMITER ;

 

 

6、取出单个分类 
-- ---------------------------- 
-- Procedure structure for cate_select 
-- ---------------------------- 
DELIMITER ;; 
CREATE DEFINER=`root`@`localhost` PROCEDURE `cate_select`(_id INTEGER) 
BEGIN 
SELECT * FROM `cate` WHERE `id`=_id; 
END;; 
DELIMITER ; 

转载:http://blog.163.com/yut-i/blog/static/24257782200862852022422/

你可能感兴趣的:(数据库设计)