跳转到主要内容
lurno
全部文章
博客

子组织、分支与分组——分别在什么时候用

子组织是子租户。分支是组织内部的一棵树,角色沿它向下级联。分组是学员报名的单位。何时该用哪一个。

The Lurno teamAugmental阅读约 1 分钟

子组织是嵌套在另一个组织里的一个完整子级组织,有自己的成员、课程体系、角色、品牌和域名。分支是单个组织内部的一棵树——校区、部门、大区——在某个分支上授予的角色,适用于它下面的一切。分组是学员实际报名所经由的班期、班级或团队。几乎每个平台都用同一个词卖出三者中的一两样,也几乎每个买家都会把三样一起要,却不加区分。

它们不是互斥的选项。一套能跑起来的配置会同时用上三者,只是高度不同:子组织划边界,分支定范围,分组管报名。把结构中的某一块放在错误的高度不致命,但撤回来很贵——因为等你发觉时,人们已经在那个你现在想把他们移出去的东西上,积下了历史记录。

  • 子组织——结构中的这一块,需不需要自己的品牌、自己的域名、自己的管理员,或者在某场安全评审里需不需要自己的一条边界?需要,它就是子组织。
  • 分支——这一块存在的理由,是不是为了让某个人可以负责组织的一个切片?是,它就是分支。
  • 分组——这一块存在的理由,是不是为了让一批人在两个日期之间一起报名、一起上课、一起被评分?是,它就是分组。

顺序有讲究。子组织是最重的答案,也最难回退,所以它应该是那个你必须为之申辩的选项。分组最轻,而需求文档里提出的东西中,有出乎意料的一部分,最后不过是一个名字听起来很重要的分组。

ORGANISATION  Northwind Academy               one tenant, one contract
 SUB-ORG      Acme Corp                       own domain, own admins, own boundary
  BRANCH      EMEA                            a role granted here reaches all below
   BRANCH     Dubai office
    GROUP     Compliance intake, September     40 people, one programme, two dates

自上而下读,每一层回答的是不同的问题。谁与谁被隔开。谁对什么负责。谁正在此刻一起学这个。

子组织:一条可以移交出去的边界

在子组织模型里,组织是一等记录,而且组织可以有父级。品牌、域名、用户、角色、内容、报名和报表全都挂在它下面。父级能看进子级;子级看不到上面,也看不到旁边。嵌套能到你真实结构那么深——学校集团、集团里的每一所学校,在有些教育信托里,集团之上还有一层联合体。

多租户

一套平台安装服务许多组织,每个组织只看得到自己的成员、内容、品牌和报表。子组织是把多租户用在一个客户内部:一个有自己边界的子租户,位于一个能看进它的父级之下。判断标准不是某个租户能不能换一个 logo,而是这条隔离能不能扛住一次失误——一个新写的、漏掉了过滤条件的导出接口,应该返回空,而不是别人的学员。

最后这一点值得向任何厂商追问,包括我们。如果租户只是行上的一个字段,那么隔离就等于应用代码记得按什么过滤,而它只成立到下一个功能上线为止。如果规则坐在数据库里,那么过滤条件缺失时,查询返回的是空。

子组织的重量是实打实的。每一个都要配置一次:品牌、一个域名及其证书、管理员、角色、留存与同意设置。作为交换,你得到一样可以移交出去的东西。子组织有一个不是你的所有者,而客户离场就是删掉一棵子树,而不是走完一份用户、分组、课程和报表的清单,并指望它是完整的。

子组织和分支有什么区别?

子组织隔开数据。它是一个嵌套的组织,有自己的用户、品牌、域名、管理员和报表,与同级之间有一条边界。分支塑造的是触及范围。它是单个组织内部一棵树上的节点,不带独立的品牌或域名,其存在是为了让在该节点上授予的角色适用于它下面的一切。决定性的问题是:结构中的这一块,有没有可能由你的管理体系之外的人来运营。有,就是子组织。如果它永远只是你自己组织架构图上的一个内部形状,那就是分支。

分支:一次授权到哪里为止

分支是单个组织内部的一个运营节点。校区、部门、院系、大区、交付中心、成本中心、加盟区域——你的组织架构图上实际写着什么,它就是什么。分支共用组织的品牌、域名、用户和内容库。它们承载的是范围。

级联就是全部意义所在。在 EMEA 分支上给某人一个角色,它就覆盖 EMEA 及其下面的一切——今天如此,等你再开两个办公室之后依然如此。没有级联树,同一个人就得每个节点授一次权,而这些授权会比它们的理由活得更久。迪拜办公室关停时,没人记得撤销迪拜那次授权,因为没人手上有一份清单。

Lurno

大区是树上的一个节点,所以区域经理只是一次授权,而且它已经覆盖了你明年才开的那个校区。

Not this

大区是一条命名约定,所以区域经理是九次授权,外加一张追踪其中哪些还应该有效的表格。

分支树出错的地方在深度。这棵树该照着组织架构图长,而不是照着课表。你每加一层,就是每来一个人时都要有人做一次判断;一棵五层深、里面只有一位管理者的树,是没有读者的管理工作。如果某一层永远不会有人在上面被授予角色,那一层是报表的一个过滤条件,不是分支。

分组:学员报名所经由的单位

分组是一批一起学同一样东西的人。四年级 B 班。九月的合规班期。应届生班。在发布前上新产品培训的那支项目团队。分组的成员会变动,通常挂着一个课程体系,而且有一个终点。

变动属于分组,这正是把它和另外两样分开的理由。成员每周都在变。有人迟到入组,有人转组,有人跟着下一期重修一个模块。这些都不该改写一个人的权限,也不该把他在组织之间挪动。把一名学员从一个分组挪到另一个分组是件小事;把一名学员在子组织之间挪动,是一次迁移。

分组可以决定一个人能看到什么吗?

不该,而一个允许这样做的系统,会把你的管理员教出坏习惯。分组只回答一个问题:谁正在此刻一起学这个。权限来自角色,在组织或分支上授予。一旦分组被当作权限的载体,会跟着出两种故障。为了让某人看到一份报表,他被加进了自己并不在的班级,于是这个班级产出的每一个完成率数字都被污染了。以及,把某人从一个班级里移除,会悄悄拿掉他对某样无关事物的访问权,而没人会把这件事和引发它的那次改动联系起来。分组决定报名;角色决定触及范围。

三个实例推演

一个学校集团

一个有两所学校的教育信托,和一家运营 114 所学校的出版社,是同一个结构在不同宽度上的样子。每所学校是一个子组织:它有一个家长认得的名字,有一位掌管自己员工名单的校长,通常有自己的域名,往往还有自己的督导和自己的经费协议。信托坐在它们上面,能往下看。

在一所学校内部,学段和教研组是分支——理科负责人只需一次授权,就覆盖学校里的每一个理科班。班级、行政班和分层班是分组。

Riverside Trust                             the group
├── Riverside Primary       SUB-ORG         own domain, own head, own inspection
│   ├── Early years         BRANCH
│   └── Key stage 2         BRANCH
│       └── Class 4B        GROUP           28 pupils, one form tutor
└── Riverside High          SUB-ORG         own domain, own head
    ├── Sciences            BRANCH          head of department scoped here
    └── Humanities          BRANCH
        └── Year 10 history, set 2   GROUP

这里的陷阱是年级。有人想要全信托按年级看学业成绩,于是年级被建成了组织,现在每个学生都待在错误的容器里,而每所学校的品牌和域名设置都得按年级重复一遍。年级是分组的一个属性,是报表里的一个维度。它不是租户。

一个企业学院

以一家企业学院为例,它在一个租户里为 15 家客户企业做培训。每家客户企业是一个子组织。它拿到自己的域名、自己的管理员——发布内容和导出报表都不必给学院发邮件——自己的品牌,以及一条在客户的安全团队问起另外 14 家时依然成立的边界。

在一家客户内部,业务单元和大区是分支,因为客户自己的培训总监需要一次覆盖全部的授权,而区域经理需要一次覆盖其中一个切片的授权。九月的入职班期、每年一轮的反贿赂培训、正在上领导力课程的那十二个人——这些是分组,它们不停地被建立、被关闭。

这里的陷阱是每一单业务建一个子组织。一家客户签了三门课,于是建了三个组织,每个都有自己的品牌要配置、自己的管理员要邀请;然后客户要一份跨这三门课的报表,没人做得出来。一家客户,一个子组织。三门课是三个分组。

一家培训机构

培训机构跑的是一个混合体,而正是这个混合体让这套模型物有所值。有一份公开课程目录,在机构自己的品牌下开放报名。有企业合同,每一份都想要一个看起来像客户自己的学院。还有认证类课程,带固定班期、评审员,以及一个会来要记录的颁证机构。

Your training company                       everything below is yours to administer
├── Public catalogue        BRANCH          open enrolments, your own brand
│   └── Project management, Nov intake      GROUP
├── Acme Corp               SUB-ORG         learn.acme.com, Acme's own admins
│   ├── EMEA                BRANCH
│   └── Americas            BRANCH
└── Borden Group            SUB-ORG         training.bordengroup.com
    └── Borden Manufacturing    SUB-ORG     a subsidiary with its own brand

有两点值得注意。公开课程目录是一个分支,不是子组织,因为那是你的品牌、你的域名、你的员工——没有什么需要隔开。还有,第三层是真实存在的:一家客户下面有自带身份的子公司,对培训机构来说是常见情形,而这正是只有一层深的子账户模型不靠命名约定就表达不了的情形。

画这棵树之前的四个问题

  1. 哪些部分,在一个陌生人的浏览器里必须显示不同的品牌和不同的地址?那些是子组织。
  2. 哪些部分需要有一个具名的人来负责?那些是分支。
  3. 哪些部分有一个开始日期和一个结束日期?那些是分组。
  4. 哪些部分之所以存在,只是因为某份报表需要一个过滤条件?那些三样都不是。

第四个问题省下的工作最多。有大量结构之所以被建出来,是因为有人想按某种方式切数字,而用结构去换一个过滤条件,是所有办法里最贵的一种。报表范围应该跟着分支树和分组走,而不是反过来。

每个校区都该是一个独立的子组织吗?

只有当这个校区有一条边界要保护的东西时才是:自己的品牌和域名、不该看到其他校区的自己的管理员,或者自己的监管机构、督导或合同。共用一套品牌、一份员工名单和一个行政团队的校区,是分支。实际差别在于活由谁干——子组织要一个一个地配置,而分支画一次,其余一切都继承下来。由各自命名的学校组成的集团,通常最后是每所学校一个子组织。一所有四个校区的大学,通常最后用的是分支。

在 Lurno 里这是怎么运作的

Lurno 把这三样都做成了各自独立的基本单元,这也是这篇文章值得写这么长的原因。子组织可以任意嵌套,每个都有自己的品牌和自己的自定义域名,并自动配置 TLS——品牌和域名那一面写在白标上。组织内部还有第二棵、彼此独立的分支树,在某个分支上授予的角色会沿着它向下级联。分组是报名的基本单元,它们自身不带任何权限。

这条边界是在 Postgres 里强制执行的,而不是在应用代码里:676 次迁移中共 868 条行级安全策略,所以一个漏掉过滤条件的查询返回的是空。这正是该向任何厂商核实的那一条说法——细节在安全页上。

有两条限制值得直说,因为它们会改变你怎么规划推广。账号是通过邀请创建的——自助注册和支付都在开发中,所以客户组织是由你来开通并开票,而不是自己下单购买。合作方登录(静默 SSO)今天可用,而 SAML 和 OIDC 在路线图上,尚未交付;如果客户的 IT 部门已经决定了员工要怎么认证,请尽早提出这件事。转售培训的机构所适用的交付模型,写在培训机构页上。

简短版

子组织负责隔开。分支负责划范围。分组负责报名。当你拿不准结构中的某一块属于哪一样时,就问:弄错了会坏掉什么。在本该是分支的地方放了一条边界,代价是重复的配置和一份你跑不出来的报表;在本该是边界的地方放了一个分支,代价是和某个安全团队的一场对话。先画树,再导数据,并且让人为清单上的每一个子组织做一次申辩。