1. 09. 核心模型
石墨文档中台-开发文档
  • 1. 适用范围
  • 00. 概述
    • 石墨文档中台能做什么?
    • 三种典型的业务接入场景
    • 石墨文档中台支持哪些格式?
  • 01. 快速开始
    • 基本概念
    • 场景一:10 分钟创建预览文件
    • 场景二:10 分钟创建协同编辑文件
  • 02. 鉴权与安全
    • 整体概述
    • 签名凭证 Token
    • 签名凭证 Signature
  • 03. 文件预览
    • 整体概述
    • 如何预热预览缓存
    • 如何防盗链
    • 常见问题处理
  • 04. 文件编辑
    • 整体概述
    • 协同文档权限设计
    • 协同文件保存与更新机制
    • 协同文件复制与删除
  • 05. 文件导入导出
    • 整体概述
    • 常见问题处理
  • 06. 石墨前端 API
    • 整体概述
    • 公共 API
      • 公共处理方法
      • 顶部栏定制 HeaderBars
    • 编辑器 API
      • 轻文档
      • 传统文档
      • 表格
      • 幻灯片
      • 表单
      • 应用表格
  • 07. 石墨后端 API
    • 整体概述
    • 错误码说明
    • 文件-预览 API
      • 访问预览文件
      • 创建文件预览缓存
    • 文件-协同编辑文件管理 API
      • 访问协同编辑文件
      • 创建协同文件
      • 创建协同文件副本
      • 删除协同文件
    • 文件-导入导出 API
      • 文件导入
        • 文件导入说明
        • 创建导入任务
        • 获取导入进度
        • 创建导入任务(旧版)
        • 获取导入进度(旧版)
      • 文件导出
        • 文件导出流程
        • 创建导出任务
        • 获取导出进度
    • 文件-表格文件(Excel) API
      • 表格接口参数说明
      • 获取表格内容
      • 获取表格中的评论数
      • 更新表格内容
      • 追加表格内容
      • 删除表格行
      • 新增表格工作表
    • 文件-文稿文件(Word) API
      • 文稿书签说明
      • 读取文稿书签内容
      • 替换文稿书签内容
    • 文件-文档文件(类 Markdown) API
      • 获取文档中的评论列表
    • 文件-应用表格文件(多维表格)API
      • 应用表格列及单元格值结构
      • 应用表格接口调用规则
      • 获取数据表列表
      • 创建数据表
      • 获取字段列表
      • 创建字段
      • 更新字段
      • 删除字段
      • 新增行
      • 获取单行
      • 更新行
      • 删除行
    • 文件-获取额外信息 API
      • 获取文件的纯文本内容
      • 文件纯文本字数统计
      • 获取文件的历史列表
      • 获取文件的版本列表
      • 获取文件内容中所有的 @ 人信息列表
      • 还原文件历史版本
    • 系统管理 API
      • 应用管理
        • 获取应用详情
        • 更新应用回调地址
      • 用户席位管理
        • 用户席位状态说明
        • 获取用户列表和席位状态
        • 激活用户席位​
        • 取消用户席位​
        • 批量设置用户席位
    • 其他 API
      • 上报事件
      • 创建行为历史
      • 推送文件内全部的用户
      • 推送用户全部的 websocket 连接
    • 获取行列表
  • 08. 回调接口(你的应用需实现的接口)
    • 整体概述
    • 文件信息
      • 文件权限说明
      • [重要] 获取文件元信息-协同文档
      • [重要] 获取文件元信息-预览文档
      • 获取当前用户的文件列表
      • 获取文件的协作者列表
      • 获取接入方指定文件的完整访问地址
      • 获取文件元信息-协同文档自动任务(admin)
      • 根据指定用户获取文件元信息-协同文档(admin)
    • 用户信息
      • 批量获取用户信息(admin)
      • [重要] 获取当前用户信息
      • 获取当前用户所在团队信息
      • 获取指定用户信息
      • 获取用户水印信息
      • 获取用户部门路径
      • 批量获取用户信息
    • 团队和部门
      • 特殊部门 ID 说明
      • 获取团队下的成员列表
      • 获取部门信息
      • 获取部门的下级部门节点
      • 获取部门下的成员分页列表
    • 搜索功能
      • 获取与文件相关的用户列表
      • 获取与文件相关的文件列表
      • 按关键字搜索文件和用户列表
    • 事件推送
      • 整体概述
      • 评论(Comment)
        • 轻文档
          • 添加评论
          • 删除评论
          • 结束评论
          • 对于评论的回复评论
        • 表格
          • 添加评论
          • 删除评论
          • 结束评论
          • 对于评论的回复评论
        • 传统文档
          • 对于评论的回复评论
          • 添加评论
          • 更新评论
          • 删除评论
        • 幻灯片
          • 添加评论
          • 删除评论
          • 结束评论
          • 对于评论的回复评论
        • 应用表格
          • 添加评论
          • 对于评论的回复评论
          • 删除评论
      • 讨论(Discussion)
        • 轻文档
          • 发送讨论消息
      • 提及(MentionAt @ 人)
        • 轻文档
          • 在评论中 at
          • 在讨论中 at
          • 在正文中 at
        • 表格
          • 在评论中 at
          • 在正文中 at
        • 传统文档
          • 在评论中 at
          • 在正文中 at
        • 应用表格
          • 在评论中 at
          • 在正文中 at
      • 日期提醒 (DateMention)
        • 轻文档
          • 创建
          • 修改
          • 删除
        • 表格
          • 创建
          • 修改
          • 删除
        • 传统文档
          • 创建
          • 修改
          • 删除
      • 文件内容更新 (FileContent)
        • 文件内容更新
      • 文档协作者协同状态变化 (Collaborator)
        • 文档协作者协同状态变化
      • 文件版本 (Revision)
        • 版本
      • 系统事件 (System)
        • 系统事件
      • 回调请求错误(实验性)
        • 回调请求错误
  • 09. 核心模型
    • 你的应用如何设计应用(app)模型?
    • 你的应用如何设计文件数据模型?
    • 你的应用如何设计通讯录模型?
    • 你的应用系统如何设计文件权限模型?
  • 10. 典型场景方案
    • 云盘场景
    • IM 场景
    • 示例代码仓库
  • 11. 常见问题
    • 访问接口提示 Signature
    • 文件预览或导入报错
    • 首次接入 SDK 报错
    • 文档预览如何做防盗链
    • 复制粘贴、全屏操作不正常
    • 如何实现文档模板功能
    • 文档内容何时保存
    • 移动端不支持 blob 协议导致预览失败
    • 如何实现文件重命名
    • 如何通过接口修改文档内容
    • @人员时如何直接跳转至对应锚点
  1. 09. 核心模型

你的应用如何设计通讯录模型?

在常规的多租户业务系统中,通讯录(用户、团队、部门、租户)通常不是一个简单的“用户列表”,而是承载了租户、组织架构、成员身份以及部门任职关系的基础能力。一个自然人可能同时存在于多个租户中,在不同租户内拥有不同的身份、权限、部门归属和业务上下文。因此,通讯录模型需要清晰地区分“物理上的人”和“租户内的用户身份”,同时保证组织、成员和权限关系都严格限定在租户范围内。
下面给出一个典型的多租户通讯录模型设计,适用于企业组织架构、SaaS 多客户空间、集团/子公司管理等常见场景。该模型可以作为业务系统对接石墨时的参考:石墨侧只需要感知租户内的用户身份 user.id,不需要感知用户背后的物理身份 person.id。通过这种设计,可以在保持业务身份清晰的同时,避免跨租户身份混淆,并为后续的组织同步、权限控制、成员管理等能力提供稳定的数据基础。
如果你的业务系统不需要支持多租户,那么移除这个模型中的 person 表和 tenant 表即可。

设计原则#

1.
用户与组织身份分离:Person 表表示自然人,租户内身份由 User 表承载。
2.
正式组织单独建模:Department 表用于存储部门信息。
3.
多租户隔离:组织、成员、权限均在租户内生效。

术语定义#

术语含义
Person自然人或登录主体,用户的物理身份,全局唯一。石墨不需要感知用户的物理身份
Tenant租户,表示一个企业或子公司
User用户在租户内的身份。user.id 是和石墨交互的用户身份 id
Department租户内正式组织节点
DepartmentUser用户与部门之间的任职关系

总体模型#

通讯录模型采用“三层对象 + 两层关系”的结构:
Person 自然人表,即这个人的物理身份是谁
Tenant 租户表,承载了企业、子公司、事业群或 SaaS 客户的基础数据
User 租户用户表自然人 Person 在租户中的身份
Department 部门表,存储了租户下的部门数据
DepartmentUser 部门用户表,存储了用户和部门的关联关系

核心实体职责#

Person#

Person 表示物理身份或登录主体。不直接承载企业组织属性。建议仅保留稳定且跨租户复用的信息:
全局用户 ID
姓名
手机号
头像
账号状态
身份来源
【重要!】:石墨文档中台不需要感知用户的物理身份,你的业务系统内部使用这个数据即可。

Tenant#

Tenant 表示某个租户。也是权限、配置、数据归属和审计边界。租户通常对应企业、子公司、事业群或 SaaS 空间。

User#

User 表示用户在某个租户中的身份。该层用于承载仅在租户范围内生效的信息,例如:
租户身份 ID 或工号
租户内分配的邮箱
显示名
岗位名称
成员类型
入离职状态
入职、离职时间
User 是通讯录模型的核心枢纽。后续部门归属、和角色权限均建议挂在该层之上。
【重要!】:User.id 是和石墨交互的用户身份 id,石墨通过这个 id 来确认用户和文件的所属关系。

Department#

Department 表示某个租户下的部门。采用树形结构表达上下级部门关系。适用于:
编制归属
审批归属
部门统计
部门树形结构展示

实体关系#

组织模型#

部门树#

部门结构表达正式组织层级,推荐采用 parent_id 作为基础关系字段,以方便进行上下级部门查询。

成员模型#

用户的物理身份(person 表)不直接挂接部门。所有组织关系均通过用户租户身份(user 表)进行管理。
该模型支持以下场景:
同一物理身份的用户属于多个租户
同一用户在不同租户中拥有不同租户身份
同一成员拥有主部门和兼职部门
内部员工、外包、顾问、访客共用统一成员体系

数据表建议#

主实体#

表名说明
person用户物理身份信息
user用户的租户身份信息
tenant租户信息
department部门节点信息

关系实体#

表名说明
department_user用户与部门的关联关系

推荐表结构摘要#

以下设计用于说明每张核心表的主键、核心字段、唯一约束和高频索引,便于继续下钻到 DDL。

person#

项设计
主键id
核心字段name、mobile、avatar_url、status
唯一约束mobile
说明仅承载自然人稳定信息,不保存租户内组织关系

tenant#

项设计
主键id
核心字段tenant_key、name、status
唯一约束tenant_key
说明作为组织、成员、权限和配置的隔离边界

user#

项设计
主键id
核心字段tenant_id、person_id、email、employee_no、display_name、title、member_type、member_status、joined_at、left_at
唯一约束(tenant_id, person_id)、(tenant_id, employee_no) 可选
说明作为租户内用户身份主表,后续关系统一挂接到该层

department#

项设计
主键id
核心字段tenant_id、parent_id、name、code、path、sort、status
唯一约束(tenant_id, code)
说明正式组织树主表,path 用于子树与祖先链查询

department_user#

项设计
主键id
核心字段tenant_user_id、department_id、is_primary、job_title、manager_user_id、start_at、end_at、status
唯一约束有效期内单用户仅一个主部门
说明承载主部门、兼职部门、任职称谓和汇报线

关系表设计视图#

DepartmentUser 是用户和部门的关联表。

关键字段建议#

user#

字段说明
id唯一id
tenant_id所属租户
persion_id对应自然人 ID
employee_no工号
display_name租户内展示名
email用户在租户中使用的邮箱
title岗位或头衔
member_typeEMPLOYEE、CONTRACTOR、PARTNER、GUEST、EXTERNAL_CONTACT
member_statusACTIVE、INACTIVE、LEFT 等
joined_at入职时间
left_at离职时间

department#

字段说明
id唯一id
parent_id父部门
code部门编码
path路径字段,用于快速祖先或子树查询
sort排序
status状态

department_user#

字段说明
id唯一id
tenant_user_id租户用户 ID,即 user.id
department_id部门 ID
is_primary是否主部门
job_title任职名称
manager_user_id直接上级租户用户 ID
start_at生效时间
end_at失效时间
status任职状态

关键约束#

1.
user(tenant_id, person_id) 保持唯一。
2.
同一用户在任一时间点只能有一个有效主部门。
3.
department、user 默认采用软删除,不直接物理删除。
4.
用户离职后不再新增有效任职关系,但保留历史记录。
5.
manager_user_id 必须指向同租户下的有效用户。
6.
部门编码在租户内建议唯一。

总结#

1.
整个通讯录模型以 user 表为中心,连接用户的物理身份、租户和部门。
2.
这个模型能够同时满足多租户隔离、部门树管理、和权限控制等要求,适合作为企业级通讯录系统的基础领域模型。
3.
这个模型同时可以可支持对接石墨文档中台,满足组织通讯录、搜索、选人、@ 人和权限过滤场景。后续再按实际需要补充角色、同步任务、外部联系人等数据表。
4.
如果你的通讯录结构相对单一,不需要支持多租户,那么直接移除掉 person 表和 tenant 表,保留 user、department、department_user 三张表即可。
修改于 2026-06-22 02:43:30
上一页
你的应用如何设计文件数据模型?
下一页
你的应用系统如何设计文件权限模型?
Built with