“角色”和“资源树”的正交关系
Role(角色)
角色表示能力,得到某个角色的账户具有了这个角色表示的能力,但是能力是作用在资源上的,主体只得到了能力还没有用,还得有资源,有施展能力的资源能力才有用。比如我们把所有的角色都给某个账户,都给这个账户也是没有用的,如果不让这个账户能够操作任何资源记录的话它有再多的角色也没用。 角色表示的是个功能集,得到某个角色的账户就得到了这个角色代表的功能,只是表示它有干某些种类的事情的能力了,可是我们不让它看到任何资源的话它的能力就没有施展的目标。比如一个账户具有了修改产品的价格的权限,产品上会有个Catalog属性,这个Catalog属性的取值来自于一棵树上的节点,比如来自一棵ProductCatalog树,我们不给这个账户的Privilege二元组集合添加任何(Account, ProductCatalog)类型的记录的话,这个账户是看不到任何产品记录的。
Catalog(目录)
Catalog模块是为了建立一片森林,每一个Catalog根节点都定性了一棵树,可以有ProductCatalog树、AccountCatalog树(也就是Organization,用户的组织结构),等各种各样的树,每棵树上取一个节点取若干棵树上的节点组成一个元组,这个元组可以标识出整个资源空间中的任何一个任何粒度的资源子集,然后我们把主体投放到具体的空间子集中去施展他/她的能力。 森林中的每一棵树上的节点所指代的都是整个资源集中的一个子集,我们通过这片森林可以把整个资源集划分成任意细致的子集。一直能划分到具体资源记录的具体单元格的具体值域的具体取值。 我们把这种由Catalog树划分的资源称作空间。使用这片森林来把整个资源空间集合划分成一个幂集。这样,由角色得到的功能集(能力集)和由Catalog得到的数据集是完全正交的,即使一个账户得到了所有的角色,但是如果没得到任何Catalog节点指代的资源的话也是啥了干不了的。 比如有5棵树组成的这片森林{tree1,tree2,tree3,tree4,tree5},我们从这5棵树上分别取一个节点组成这样一个5元组(tree1.Node001,tree2.Node01.02,tree3.01,tree4.10,tree5.node3)。这个5元组定位了资源空间中的一个子集,通过这样的5元组我们能够定位到整个资源空间的任意精细的子集,我们可以把给定的主体投放到那个空间中去,主体只有来到了具体的资源空间才能施展他的能力。即使一个主体拥有很多角色也没有用处的,因为他身上的那些能力只有在来到具体的空间中才会发挥作用的。试想一下一个会做饭的主体不在厨房没有油盐酱醋茶,一个会驾驶的主体没有车子 Catalog抽象了一切,Codespace、ResourceType、Field、值域、具体的值,都是Catalog森林上的节点。
站在主体的角度,万事万物皆分类
普通的分类只是对一个集合中的所有元素进行简单的单元划分,分成几个兄弟组,这些兄弟组下面不再继续分类。复杂的分类是那个Catalog(目录)树,复杂的分类才是棵树。简单的分类直接使用Dic和DicItem模型去表达就可以。普通的分类其实就是实体的属性。实体上的CategoryCode字段与实体的固有属性没有本质差别,只是CategoryCode这样的字段是系统附加给实体的字段,而固有属性是业务附加给实体的字段。实体的一个固有属性的本质也是一次分类,比如人的性别属性,取值为男、女、未知、未说明的意思就是把人按照性别分为4类。人的姓名也是分类,只不过这种分类的枚举值比性别要多的多。人的年龄也是分类,年龄分类的取值也很多。对于取值非常多的那些分类项通常人们引入计算逻辑,合理分配存储和计算。
[该贴被anycmd于2015-01-31 08:24修改过]