子賬號表的設計(不用遞歸實現查詢,同一張表做外鍵)


最近公司在做《資管系統》賬號管理部分需要得到所有子賬號、父賬號等等信息。個人覺得用遞歸查詢比較繁瑣,於是設計了以下表

關鍵字段:賬號id,父賬號、頂級賬號、賬號層次(也就是樹的級別)。

查詢思路:查找頂級賬號用層這個字段直接搞定

     查找某個賬號的子賬號用該賬號的頂級賬號和層搞定

     查找父賬號用該賬號的頂級賬號和層搞定

設計難點:一張表外鍵關聯到自己、添加修改刪除時對數據的有效性有很大的保障

提供源碼(包含查詢方法),需要其他字段自行增加 (勿噴)

 

表和數據

-- ----------------------------
-- Table structure for `tb_account`
-- ----------------------------
DROP TABLE IF EXISTS `tb_account`;
CREATE TABLE `tb_account` ( `id` int(11) NOT NULL COMMENT '賬號ID', `name` varchar(32) NOT NULL COMMENT '賬號名稱', `password` varchar(64) NOT NULL COMMENT '賬號密碼', `degree` int(11) NOT NULL COMMENT '賬號層次,賬號樹的層次', `parent` int(11) NOT NULL COMMENT '父賬號ID', `master` int(11) NOT NULL COMMENT '頂層賬號ID,即真實賬號', `childs` text COMMENT '子賬號列表,所有的子賬號id(包含子賬號的子賬號),按"|"分割', `inserttime` datetime DEFAULT NULL COMMENT '插入時間', `updatetime` datetime DEFAULT NULL COMMENT '修改時間', `remark` varchar(256) DEFAULT NULL COMMENT '備注', PRIMARY KEY (`id`), KEY `FK_TB_ACCOUNT_REFERENCE_TB_ACCOUNT_P_` (`parent`), KEY `FK_TB_ACCOUNT_REFERENCE_TB_ACCOUNT_M_` (`master`), CONSTRAINT `FK_TB_ACCOUNT_REFERENCE_TB_ACCOUNT_M_` FOREIGN KEY (`master`) REFERENCES `tb_account` (`id`), CONSTRAINT `FK_TB_ACCOUNT_REFERENCE_TB_ACCOUNT_P_` FOREIGN KEY (`parent`) REFERENCES `tb_account` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of tb_account -- ---------------------------- INSERT INTO `tb_account` VALUES ('1', 'acct_1', '1', '1', '1', '1', null, null, null, null); INSERT INTO `tb_account` VALUES ('2', 'acct_2', '2', '1', '2', '2', null, null, null, null); INSERT INTO `tb_account` VALUES ('3', 'acct_3', '3', '2', '1', '1', null, null, null, null); INSERT INTO `tb_account` VALUES ('4', 'acct_4', '4', '2', '1', '1', null, null, null, null); INSERT INTO `tb_account` VALUES ('5', 'acct_5', '5', '3', '3', '1', null, null, null, null); INSERT INTO `tb_account` VALUES ('6', 'acct_6', '6', '3', '3', '1', null, null, null, null); INSERT INTO `tb_account` VALUES ('7', 'acct_7', '7', '4', '5', '1', null, null, null, null); INSERT INTO `tb_account` VALUES ('8', 'acct_8', '8', '4', '6', '1', null, null, null, null); INSERT INTO `tb_account` VALUES ('9', 'acct_9', '9', '4', '6', '1', null, null, null, null); INSERT INTO `tb_account` VALUES ('10', 'acct_10', '10', '2', '2', '2', null, null, null, null); INSERT INTO `tb_account` VALUES ('11', 'acct_11', '11', '2', '2', '2', null, null, null, null); INSERT INTO `tb_account` VALUES ('12', 'acct_12', '12', '3', '11', '2', null, null, null, null); INSERT INTO `tb_account` VALUES ('13', 'acct_13', '13', '3', '11', '2', null, null, null, null);

 

查詢操作

-- 查找所有的頂級賬號
-- SELECT id,name,degree,parent,`master` FROM tb_account WHERE degree = 1

-- 查找頂級賬號的所有子賬號(包括子賬號的子賬號)
-- SELECT * FROM tb_account WHERE  `master` = 1

-- 查找子賬號的父賬號,根據子賬號的parent直接找
-- SELECT * FROM tb_account WHERE  id = 1 -- (parent)

-- 查找子賬號的所有子賬號(包括子賬號的子賬號)
-- 賬號id、層次
-- SELECT a.id,a.name,a.degree,a.parent,a.`master` 
-- FROM tb_account a,tb_account b
-- WHERE b.id = 1 and a.`master` = b.`master` AND a.degree > b.degree

-- 查找當前賬號的直接子賬號
-- SELECT * FROM tb_account where parent = 1 -- (當前賬號id) 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM