You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core 6应用多权限MongoDB数据库Schema设计咨询

MongoDB Schema设计方案(多环境多工作区权限场景)

核心集合设计

1. Users 集合

存储用户基础信息,避免冗余:

{
  "_id": ObjectId("用户唯一ID"),
  "username": "zhangsan",
  "email": "zhangsan@example.com",
  "passwordHash": "xxx",
  "createdAt": ISODate("2024-01-01T00:00:00Z")
}

2. Environments 集合

维护工作环境及环境内的用户角色,这是所有权限的基础:

{
  "_id": ObjectId("环境唯一ID"),
  "name": "生产运营环境",
  "description": "公司核心业务运营环境",
  "members": [
    {
      "userId": ObjectId("用户ID"),
      "role": "Admin" // 可选值:Admin/Worker
    },
    {
      "userId": ObjectId("用户ID"),
      "role": "Worker"
    }
  ],
  "createdAt": ISODate("2024-01-01T00:00:00Z")
}

3. Workspaces 集合

关联所属环境,同时区分Public/Private权限:

{
  "_id": ObjectId("工作区唯一ID"),
  "name": "销售数据看板",
  "description": "月度销售数据分析工作区",
  "environmentId": ObjectId("所属环境ID"),
  "type": "Private", // 可选值:Public/Private
  "creatorId": ObjectId("创建者Admin的用户ID"),
  // 仅Private类型工作区需要该字段
  "authorizedUsers": [
    ObjectId("授权用户ID1"),
    ObjectId("授权用户ID2")
  ],
  "createdAt": ISODate("2024-01-01T00:00:00Z")
}

权限验证逻辑

  1. 环境准入校验:用户访问任何工作区前,必须先确认自己是该工作区对应环境的成员(在Environments的members列表中存在)。
  2. 工作区访问校验:
    • 若为Public工作区:只要用户是所属环境的成员(不管是Admin还是Worker),直接允许访问。
    • 若为Private工作区:需满足两个条件之一:
      • 是该工作区的创建者(creatorId匹配用户ID);
      • 在authorizedUsers列表中,且是所属环境的成员。

对你原方案的评估

你之前考虑的两个关联集合(用户-工作区、用户-环境)方案是可行的,但可以根据场景选择更合适的设计:

  • 如果你的场景中环境成员或工作区授权变更特别频繁,或者需要记录关联的变更历史,单独的关联集合更适合,比如:
    • UserEnvironment集合:{ userId, environmentId, role, createdAt }
    • UserWorkspace集合:{ userId, workspaceId, authorizedAt }(仅用于Private工作区)
      但这种方式会增加查询次数,比如验证Private工作区权限时,需要先查用户是否在对应环境,再查是否在工作区授权列表。
  • 上面给出的嵌入式设计更符合MongoDB的特性,能减少查询次数,比如查用户所有可访问的环境,直接筛选Environments中members包含该用户ID的文档;查可访问的工作区,先拿到用户所属环境ID,再筛选对应环境下的Public工作区+Private工作区中用户在authorizedUsers里的文档,效率更高。

内容的提问来源于stack exchange,提问作者Nono-Man

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 06:12:29