树形结构表的设计问题?

ydage 2008-11-03 04:43:52
树形结构表的设计问题:
如有一组织结构表的层级关系如下:
总公司(01)
分公司A (0101)
子公司A1 (010101)
子公司A2 (010102)
分公司B (0102)
同上...........
分公司C (0103)
同上...........

问题:如果子公司A1只向其上级分公司A汇报,则上述表结构就可以实现,现在是子公司A1同时可以向分公司A和分公司B汇报(以后可扩充到向多个上级汇报),如何修改表结构实现?
...全文
215 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
丰太君 2011-02-27
  • 打赏
  • 举报
回复
用多一个字段 来描述 公司级别信息,把公司层次信息独立出来,不就行了?
lihuanmei 2008-11-04
  • 打赏
  • 举报
回复
多对多的关系,把它拆分成多对一的多个表吧
ydage 2008-11-04
  • 打赏
  • 举报
回复
也就是想实现当子节点有多重父节点时,如何设计表结构?用单表还是用多表好?
jiongjiongtang 2008-11-03
  • 打赏
  • 举报
回复
汗,没看到下面的问题,以为就是个树型结构,不好意思啊.
jiongjiongtang 2008-11-03
  • 打赏
  • 举报
回复
id name parentid
1 总公司 0
2 子公司A1 1
3 子公司A2 1
4 子公司A1a 2
5 子公司Aab 2
6 子公司A2a 3
7 子公司A2b 3
............
在用递归可以实现出来.

/// <summary>
/// 创建新节点
/// </summary>

private void CreateChildNode(TreeNode parentNode, DataTable dt, bool isExpanded, string sSelectData)
{
//连接数据,添加排序表达式
DataRow[] rowList = dt.Select("parentid=" + Convert.ToInt32(parentNode.Value));
foreach (DataRow row in rowList)
{
//创建一个新节点
TreeNode node = new TreeNode();
node.Text = row["name"].ToString();
node.Value = row["id"].ToString();
node.Expanded = false;
if (node.Value == sSelectData)
{
node.Selected = true;
}
parentNode.ChildNodes.Add(node);
//递归调用,创建其他节点
CreateChildNode(node, dt, isExpanded, sSelectData);

}

}

/// <summary>
/// 把数据递归添加到树形控件里面
/// </summary>

public void BindSortTreeView(TreeView treeView, bool isExpanded, string sSelectData)
{

//将获取的数据放到DataTable里面

DataTable dt = CategoryManager.GetCategoryAll(); //查询所有表里的记录

treeView.Nodes.Clear();//清空树的所有节点

//获取与排序顺序中的筛选器以及指定的状态相匹配的所有System.Data.DataRow 数组

DataRow[] dataRowlist = dt.Select("parentid='0'");

if (dataRowlist.Length <= 0)
{
return;
}

//创建根节点
TreeNode rootNode = new TreeNode();
//设置根节点的属性
rootNode.Text = dataRowlist[0]["name"].ToString();
//设置根节点的值
rootNode.Value = dataRowlist[0]["id"].ToString();
rootNode.Expanded = true;
rootNode.Selected = true;
//添加根节点
TreeView1.Nodes.Add(rootNode);
//递归
CreateChildNode(rootNode, dt, isExpanded, sSelectData);
}

protected void Page_Load(object sender, EventArgs e)
{

if (!Page.IsPostBack)
{


BindSortTreeView(TreeView1, true, "0");

}
}

希望对你有帮助.
weixy 2008-11-03
  • 打赏
  • 举报
回复
分2个表记录。
1。记录组织结构
2.记录汇报结构
  • 打赏
  • 举报
回复
那你这还是树形结构吗?
ydage 2008-11-03
  • 打赏
  • 举报
回复
TO HEROWANG,fcuandy两位楼主,你们没有完全理解题意
------------------------------
总公司(01)
分公司A (0101)
子公司A1 (010101)
子公司A2 (010102)
分公司B (0102)
同上...........
分公司C (0103)
同上...........
-------------------------------
如子公司A1可以同时向分公司A与分公司B汇报,如何通过查询就能看出来
fcuandy 2008-11-03
  • 打赏
  • 举报
回复
一般两种方式方式:

1,bom法

id name parentid
1 aa null
2 a1 1
3 a2 2
4 a3 2
..

2,path法
id name path
1 aa null
2 a1 1
3 a1_2 1,2
4 a1_2_3 1,2,3
5 a1_2_2 1,2,3
有的是这样
code name
001 aa --这里为了显示清楚些我把000000001中间加了分隔
001001 a1
001001001 a2
001001001001 a3
001001001002 a4

各种设计都有其优缺点,应该依具你具体情况选择。
  • 打赏
  • 举报
回复
楼主看看这个,
http://topic.csdn.net/u/20080822/10/34e9c55f-33c0-43ee-a81f-c5fc8d7a11ce.html
ydage 2008-11-03
  • 打赏
  • 举报
回复
szx1999:
---------------------------
你所提供的方案,也曾考虑过,如果分公司数目超过10个以上,通过字符串的方式实现,感觉拼写与查询都不太方便。
duset 2008-11-03
  • 打赏
  • 举报
回复

id name level
01 总公司 总
0101 分公司A 分
010101 子公司A1 子



--现在是子公司A1同时可以向分公司A和分公司B汇报(以后可扩充到向多个上级汇报),如何修改表结构实现?
select name from t where level = '分'

level层次深的话就int型好了.
等不到来世 2008-11-03
  • 打赏
  • 举报
回复
id		name		pid
01 总公司 null
0101 分公司A 01
010101 子公司A1 0101,0102
010102 子公司A2 0101
0102 分公司B 01
...
-晴天 2008-11-03
  • 打赏
  • 举报
回复
表尽管建,他要汇报汇报去好了,与建表何干!
-晴天 2008-11-03
  • 打赏
  • 举报
回复
违反公司法.

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧