iKonekt

面向集团与多品牌

多家公司,一套部署,客户互不共享

集团通常用两种糟糕的方式解决这个问题:要么五套独立部署、五套样样独立的系统,要么一套部署加上一个郑重承诺——应用程序永远会正确过滤。第一种很贵。第二种只是个承诺,而承诺不是安全模型。

如果你经营着不止一家公司——一个拥有子公司的控股集团、一个特许经营体系、两个面向不同市场的品牌、一家代理商和它孵化出的业务——你早已熟悉这个问题的形状。品牌之间共享人员、工具和财务部门。它们不共享客户,而且绝不能看起来共享。

iKonekt 用一套部署运行所有公司,而公司之间的隔离由数据库而非代码来保证。这个区别听起来很学术,直到某一天它不再学术。

为什么这一层很重要

应用层的过滤只是查询里的一句话。它有效的前提是:今后写下的每一条查询都包含它——包括匆忙写下的那条、新开发人员写的那条,以及为一份只会用一次的报告写的那条。

把边界推进数据库,算术就反转了。策略在每一次读取和写入时运行,位于一切之下。一条忘记带公司条件的查询不会返回错误的行;它什么都不返回。故障模式变成一个空屏幕和一个困惑的开发人员——这正是正确的故障模式。

空屏幕是一种特性。我们宁愿向自己的工程师解释一个空屏幕,也不愿向两位没料到会碰面的客户解释同一份客户名单。

一套部署每家公司
  • 1客户与对话按公司隔离。品牌 A 的销售人员在结构上就无法访问品牌 B 的客户,靠的是构造而非配置。
  • 2客户的归属权“我们已经拥有这个账户”是一把按公司持有的锁——因此两个品牌可以同时耕耘同一个市场而互不冲突。
  • 3提示词与设置每家公司编辑自己的。这里曾经唯一一次被共享过,那是个 bug——也是这套系统最自豪找到的 bug。
  • 4合作伙伴项目每家公司一个模块,而不是人人继承的全局模块。

边界在应用之下强制执行

集团真正能共享什么

隔离不是为了隔离而隔离。值得在集团内共享的东西是被有意共享的,而且大多是无聊的那些——这恰恰是对的,因为重复的成本正藏在无聊的东西里:

  • 一套需要运行和更新的部署。一次部署、一套需要保管的凭据、一件需要打补丁的东西。
  • 一支团队,戴着不同的帽子。一个人可以在多家公司工作;他不能做的,是通过一条忘记询问的查询同时看到两家。
  • 一套习惯。线索如何分配、备注如何书写、工单如何变成发票——学一次,处处适用,入职培训因此缩短到一个上午左右。
  • 与家族其余部分的一种关系。底层是 castomAPI、同一个账户、同样的连接器——在重要的地方按公司配置。

集团总会问的第二个问题

“我们能跨所有公司出报表吗?”能——从集团自己的视角,有意且明确地进行,而不是作为边界泄漏的副作用。这个区别就是全部设计:跨越边界必须是一个人有意为之、且拥有相应权限的行为。它绝不能是一个游离的标识符偶然就能完成的事。

而他们问的第三个问题是:“如果我们卖掉其中一个品牌会怎样?”由数据库守护的边界,也是一个你能从中干净地取出一份副本的边界。这不是巧合——隔离与可移植性,是同一种性质在两场不同会议上的样子。

地板之下

具体是什么在守住这条线

不是一句宣称,而是一份清单。如果供应商拿不出关于自己产品的这份清单,那就值得留意。

26

数据表自带公司归属,校验是强制开启的,而不仅仅是可用。

72

策略逐条写出,确保每一条都由真人读过,而不是循环批量生成。

942

测试:每次有任何变动,都在一个从零重建的数据库上运行。

0

默认公司。没有作用域的请求在触达数据之前就会抛出异常——不存在一个可能忘记关闭的回退机制。

隔离是如何构建的 →

“五家公司,五套安装,五张你的账单。”

一次安装。数据库为你守住的五道边界。

共享人员、共享习惯、共享平台——但没有一个共享的客户。跨越这条线必须是一个人有意的举动,绝不能是一个标识符的意外操作。

隔离是如何构建的 →