#2
mywisdom882016-08-24 11:48
|
看到一位朋友发的《请问,如何创建和使用组织机构?》帖子,以及其他高手的回复,觉得有必要将自己的工作心得与大家分享一下。
SQL数据库大多应用于一些管理领域,管理总是针对人和物的,而人的社会属性和物的自然属性,千差万别,种类繁多,要对人和物进行有效乃至高效的管理,就必然要对其分类,这种分类基本都是树形结构。
对于树形结构的理解,有N多的文章介绍,但多数研究的是结构中的枝干,而少有研究叶子的。只有将枝干和叶子一起研究,才能真正理解树形结构的一些理论基础。
本人对树形结构的理解,归纳起来,有以下一些基本要点:
1. 没有叶子的枝干没有存在意义。即任何最底层的分类下都必须有明细。
2. 不存在没有枝干的叶子。即不进行分类管理的数据不在树形结构的讨论范围。
3. 只有1个枝干不能称为树。即只有一级分类的数据也不在树形结构的讨论范围。
4. 每一片叶子到树根的路径长度可以是不同的。即所有分类管理的数据的明细代码长度不等。
5. 任意两片叶子到树根的路径都不相同。即所有分类管理的数据的明细代码是唯一的。为此,必须规定下面这条要点:
6. 叶子必须是所在枝干的最底层。已经长了叶子的枝干下,不能再生长新的枝干,某一个枝干下不能既有枝干又有叶子。在实际应用中,明细和分类不能处于同一级别上。
7. 一种树上的叶子可以在该树的所有枝干上移动。即可以改变明细的某种属性。如某位员工可以在不同单位或部门间调动。
设计数据库表,应坚持3个要点:
1.一个应用系统中所有的分类类别(即所有树的枝干)都可以放在一张表中。
2.不同树种的叶子,放在不同的明细表中。
3.任何明细数据(叶子)都不能放在分类表中。
分类表的设计要点:至少要有3个字段:ID、代码、名称,也可以增加一个“全称”字段, “名称”字段类似于文件夹的名称,“全称”字段类似于文件夹的绝对路径,全称字段中数据,应使用统一的分隔符分隔各级别。“全称”字段不是必须的,它可以用分类的代码作为参数通过一个特定的自定义函数获得。某个分类如果和其他数据有关联关系,也可以设置其他字段记录相应的ID值。
分类表的代码设计要点:
1.如果有多种分类(即多个树种),应增设一个区分分类属性的字段(如“类别”)。
2.不同种类(树种)下各级分类代码长度可以不同,但同一种类(树种)下各级代码长度必须相同。
3.某个种类各级代码长度应按最大所辖下级分类数量设置。实际应用中,每级代码长度2位应该够用,一个分类下面管理超过百种的下级,那种设置是不科学的。
4.某个种类下的明细代码长度必须大于该种类下分类级别的长度。例如,如果每级代码长度为2位,则明细代码长度必须是3位或大于3位。类别代码的长度不可能一致,但明细序号的长度必须一致。
所有叶子(明细)的代码都是由类别代码+明细序号组成,由于叶子的序号长度是固定的,所以完全可以通过叶子的代码获取它所属的类别。
下面以《请问,如何创建和使用组织机构?》帖子中的例子为例,说明数据组织和编码:
(假如不仅有机构组织分类,还有诸于供货商、存货、产品等等分类)
ID 类别 代码 名称 全称
1 机构 01 A集团 A集团
2 客户 02 华中地区 华中地区
3 机构 0101 B单位 A集团\ B单位
4 机构 010101 C1部门 A集团\ B单位\ C1部门
5 机构 01010101 D1科室 A集团\ B单位\ C1部门\ D1科室
6 机构 01010102 D2科室 A集团\ B单位\ C1部门\ D2科室
7 机构 010102 C2部门 A集团\ B单位\ C2部门
假如A集团员工数量较大,全部在职人数超过万人,而且人员流动频繁,再假如A集团\ B单位\ C1部门\ D2科室有个员工叫张三,张三入职时在该集团的序号是006789(注意这个序号是长度是6位,按减少数据冗余的理论,5位序号足够,但考虑企业的发展,在职员工可能突破10万,或者人员流动频繁,若干年后,新员工的序号也可能突破99999的,那时,5位序号就会带来很大麻烦),张三的代码就是01010102006789,假如张三从A集团\ B单位\ C1部门\ D2科室转调到A集团\ B单位\ C1部门工作(叶子在不同枝干上发生移动),张三的代码就变为010101006789。
这种对数据进行分类的最大好处有以下几点:
1. 由于不需要固定叶子的路径长度,树种叶子的分类级次不受限制,可以适用于所有分类管理的应用。
2. 极大的简化了编程,因为所有的分类都集中在一张表中,完全可以设计一个类,适当设计一些类属性,就可以应用于所有的数据分类程序界面。本人就是用这种方法,把分类管理和明细管理设计在一个界面上,在这个界面上,既可以编辑明细,也可以管理分类,而且界面非常简洁直观。
3. 这种分类管理办法,对于操作人员来说,强调的是业务逻辑,要想找到某片叶子,只要会顺藤摸瓜,就会很容易找到,而不需要死记硬背叶子代码。叶子代码不再是操作人员对叶子进行输入输出所必需的,而只是对叶子属性的数字表述。