多级目录设计思想

原创 2006年05月24日 22:27:00
一、基本设计思路
改进表结构:可以实现无限级分目录, 根据网站需求可限制最多分级目录5级目录
ID 主键
ENName, ENNameCHNName1JapanNameKoreaName 分类名称
ParentID 父节点ID (ID成父子关系) ParentID 0 时表示根目录
ParentID 等于 ID 的值时,表示对应ID的子目录
Depth 当前结点分类级数(深度) 如一级,二级,三级
ParentStr 所有父节点ID
Child 共计多少一级子目录无子目录值为0
RootID 根节点分类ID 用于排序
SortType 类目录类型
SortOrder 排序
SortType 目录分类标识
如以下示意 (图1)
ID
Name
ParentID
ParentStr
Depth
RootID
Child
SortOrder
SortType
1
中国
0
0
0
1
2
1
Area
3
广东省
1
1
1
1
1
2
Area
4
深圳市
3
1,3
2
1
1
3
Area
5
江西省
1
1
1
1
0
5
Area
6
南山区
4
1,3,4
3
1
0
4
Area
7
日本
0
0
0
2
1
6
Area
8
大阪
7
7
1
2
0
7
Area
如值取6代表 中国->广东省->深圳市->南山区
 
关键函数
新增目录函数
string InertNewSort( int intSelectedSortID, string strSortType, string[] arrFieldName, string[] arrFieldValue)
参数说明:intSelectedSortID 当前选择要增加目录的ID如是根目录其值为0, strSortType 为识别对应目录的类别arrFieldName为对应目录名称,arrFieldValue为对应目录名称的取值。
主要设计思想:
示列如图1 如果增加新的根目录,ID值为数据库里Max(ID)加1如果Max(ID)不存在则为1,ParentID为0,ParentStr为0,Depth为0,RootID的取值方法与ID相同,Child为0,SortOrder 为取得的ID值。
如不为根目录,ID取值同上,ParentID为选中目录的ID值(对应的父目录ID),ParentStr为对应父目录的ParentStr加父目录的ID,如是根目录则为ParentStr加父目录的ID,Depth为对应父目录Depth值加1
RootID为对应父目录的RootID值
 
递归函数 void CheckAndFixSort(int intParentID, string strSortType)
在每一次更新数据后,用此函数来格式化Depth,Child,ParentStr,SortOrder 三个字段
无返回值
设置排序函数intSetSortOrder(int intID,string strGetType,string strSortType)
返回影响的行数
主要功能:设置前台显示的顺序(对同级目录排序) 每次设置排序只能移动一个单位
参数说明:intID 为当前要排序的ID , strGetType 为当前排序移动类别(GoUp 为向上移动,GoDown 为向下移动),strSortType 为识别对应目录的类别
 
主要设计思想:
示列如图1 如果要把江西省的排序排在广东省前(向上移动目录),先找出对应省份下有多少个子目录,并记录其Id值。
因为一个目录时基对应的所有子目录也要跟随其移动,如上图:江西省对应的所有子目录个数为 0 个,广东省其对应的子目录个数为为2个,各自加1后其值分别为1个与3个,然后对江西省的所有子目录包含基自身的SortOrder 值减去属于广东省目录的个数为3,再对广东省所有对应的子目录包含基自身的 SortOrder 值加上所有属于江西省目录的个数为1 即得到新的目录排序。如果要把广东省的排序排在江西省后(向下移动目录)方法相同。
主要函数:
  public void CheckAndFixSort(int intParentID, string strSortType, ref int intFixSortOrder)
  {
   DataSet ds = new DataSet();
   string strParentStr;
   // 初始化所有的根节点的 Depth, ParentStr 值
   if(intParentID == 0)
    _db.ExecuteAdapter("UPDATE TSortConfig SET Depth = 0,ParentStr = '0' WHERE SortType = '"+ strSortType +"' AND ParentID = 0");
   string strSelectSql = "SELECT ID,RootID,ParentStr,Depth FROM TSortConfig WHERE SortType = '"+ strSortType +"' AND ParentID ="+ intParentID +" ORDER BY RootID,SortOrder";
   ds =  _db.ExecuteAdapter( strSelectSql );
   foreach (DataRow myRow in ds.Tables[0].Rows)
   {
    if(myRow[2].ToString() != "0")
     strParentStr = myRow[2].ToString() +","+ myRow[0].ToString();
    else
     strParentStr = myRow[0].ToString();
    int intTemp = Int32.Parse(myRow[3].ToString()) + 1;
    string strUpdateSql = "UPDATE TSortConfig SET Depth = "+ intTemp +", ParentStr = '"+strParentStr+"', RootID = "+myRow[1]+" WHERE ParentID ="+myRow[0]+" AND SortType = '"+ strSortType +"'";
    
    // 更新所有下 ID = myRow[0] 子一级目录的 Depth, RootID 值
    int intChild = _db.ExecuteNonQuery( strUpdateSql );
    
    // 更新所有 ID = myRow[0] 的 Child, SortOrder 值 SortOrder 为参数传递入值
    _db.ExecuteAdapter( "UPDATE TSortConfig SET Child = "+intChild+", SortOrder = "+intFixSortOrder+" WHERE SortType = '"+ strSortType +"' AND ID="+ myRow[0]);
    intFixSortOrder++;
    
    // 递归调用 CheckAndFixSort 函数
    CheckAndFixSort(Int32.Parse(myRow[0].ToString()),strSortType, ref intFixSortOrder);
   }
  }
// 添加新目录
  public string InertNewSort( int intSelectedSortID, string strSortType, string[] arrFieldName, string[] arrFieldValue)
  {
   int intRootID = 0,intID = 0,intParentID = 0,intDepth = 0,intSortOrder = 0,intMaxRootID = 0;
   string strParentStr = "0";
   string[] arrParamName = new string[12];
   string[] arrParamValue = new string[12];
  
   #region 取相关数值
   if(intSelectedSortID != 0 )
   {
    string[] arrNewSortItems = GetNewSortItems(intSelectedSortID,strSortType);
    intRootID = Int32.Parse(arrNewSortItems[0].ToString());
    intParentID = Int32.Parse(arrNewSortItems[1].ToString());
    intDepth = Int32.Parse(arrNewSortItems[2].ToString());
    intSortOrder = Int32.Parse(arrNewSortItems[3].ToString());
    if(intDepth+1 > intMaxDepth )
    {
     return "最大深度为"+(intMaxDepth+1).ToString()+"级";
    }
    strParentStr = arrNewSortItems[4].ToString();
   }
   else
    intMaxRootID = GetMaxIdValue("RootID",strSortType);
   #endregion
   // 准备入库的数值
   intID = GetMaxIdValue( "ID",strSortType);
   if(intSelectedSortID != 0)
   {
    intDepth++;
    intSortOrder = intID;
    if (strParentStr.Equals("0"))
     strParentStr = intSelectedSortID.ToString();
    else
     strParentStr = strParentStr + "," + intSelectedSortID.ToString();
   }
   else
   {
    intDepth = 0;
    intRootID = GetMaxIdValue( "RootID",strSortType);
    intSortOrder = 0;
    intParentID = 0;
    strParentStr = "0";
   }
   #region 把数据存入数组
   
   arrParamName[0] = arrFieldName[0];
   arrParamName[1] = arrFieldName[1];
   arrParamName[2] = arrFieldName[2];
   arrParamName[3] = arrFieldName[3];
   arrParamName[4] = "SortType";
   arrParamName[5] = "Id";
   arrParamName[6] = "ParentID";
   arrParamName[7] = "ParentStr";
   arrParamName[8] = "Depth";
   arrParamName[9] = "RootID";
   arrParamName[10] = "Child";
   arrParamName[11] = "SortOrder";
   arrParamValue[0] = arrFieldValue[0];
   arrParamValue[1] = arrFieldValue[1];
   arrParamValue[2] = arrFieldValue[2];
   arrParamValue[3] = arrFieldValue[3];
   arrParamValue[4] = strSortType;
   arrParamValue[5] = intID.ToString();
   arrParamValue[6] = intParentID.ToString();
   arrParamValue[7] = strParentStr;
   arrParamValue[8] = intDepth.ToString();
   arrParamValue[9] = intRootID.ToString();
   arrParamValue[10] = "0";
   arrParamValue[11] = intSortOrder.ToString();
   #endregion
   int intReturnValue = InsertSort( arrParamName, arrParamValue );
   int intFixSortOrder = 1;
   CheckAndFixSort(0,strSortType,ref intFixSortOrder);
   return "目录添加成功";
  }

多级目录的数据库设计

  • 2008年09月08日 16:15
  • 1KB
  • 下载

《Linux/unix设计思想》—读后总结

这本书并没有在操作系统实现上下功夫去讲,而是讲了操作系统的道,颇有中国道家一般思想。至于对我如何去总结呢?我想主要是记录一下对自己感触最深的几点就行。因为整本书都是总结,经验之谈。有很多东西,它很难讲...
  • u010717334
  • u010717334
  • 2015年03月10日 20:50
  • 588

mkdir创建多级目录

今天才知道mkdir() 可以创建多级目录,以前使用的时候,自己一级一级的创建,有些麻烦,突然之间觉得这个函数太好使了。 下面是php手册上 bool mkdir ( string $pat...
  • renzhenhuai
  • renzhenhuai
  • 2014年02月20日 14:49
  • 7494

linux 创建多级目录 mkdir -p

mkdir的-p选项允许你一次性创建多层次的目录,而不是一次只创建单独的目录。例如,我们要在当前目录创建目录Projects/a/src,使用命令 1 mkdir -...
  • helllochun
  • helllochun
  • 2014年11月27日 11:39
  • 13773

PHP创建多级目录

PHP针对目录的创建,有一个专门的函数mkdir():成功,返回true,失败,返回false 函数mkdir有四个参数: path:要创建的目录的名称 mode:权限。默认是0777(最大权限...
  • u014316363
  • u014316363
  • 2015年01月19日 10:49
  • 1209

《深入理解Android内核设计思想》读书有感

《深入理解Android内核设计思想》林学森编著,这本书是带我的老师给我的。因为最近啃《Android系统源代码情景分析》这本书binder驱动相关部分时被撂倒在地。 于是跑去跟老师诉苦,她给我推荐...
  • koozxcv
  • koozxcv
  • 2016年03月11日 17:27
  • 2538

windows平台下一次创建多级目录

该代码用于一次性创建多级目录: #include #include #include #include int main() { char szPath[128] = { 0x00 };...
  • li2818
  • li2818
  • 2017年06月06日 21:07
  • 1744

常用设计思想

云创 8.8章 9.3章 EDA先锋工作室 第5章
  • guqian110
  • guqian110
  • 2013年09月02日 17:25
  • 1146

c++创建多级目录

c++创建多级目录 自己写的chuangjian
  • liyun123gx
  • liyun123gx
  • 2014年05月14日 16:10
  • 882

linux 递归删除多级目录

代码如下: #include int CParseJson::emptyDir(const char* destDir) { int ret = 0; DIR* dp = NULL; str...
  • liangzhao_jay
  • liangzhao_jay
  • 2016年04月06日 16:32
  • 887
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:多级目录设计思想
举报原因:
原因补充:

(最多只允许输入30个字)