Skip to content

Production Group Schema (drupal.org, Group v3.3)

This diagram is read directly from config/sync/*.yml in the actual drupal.org site codebase (~/Sites/pl-drupalorg, GitLab origin drupal-infrastructure/sites/drupalorg), not reconstructed from documentation. It reflects what drupal.org’s Groups feature actually runs today.

This is Group v3.3, not v4 — confirmed by composer.json ("drupal/group": "^3.3") and by the config schema itself using the v3 content_plugin key (v4 renamed this to relation_type). The Group v4 target design diagram elsewhere on this site is not what’s actually running in production; this page is. Latest 4.0 release: 4.0.0-alpha2, published 2026-08-21 — still alpha, not yet stable.

erDiagram
  group { string label "Group (bundle: community_group)" }
  group_type { string label "Group type (config)" }
  group_relationship { string label "Group relationship" }
  group_relationship_type { string label "Relationship type (config)" }
  group_role { string label "Group role (config)" }
  node { string label "Content" }
  node_type { string label "Content type" }
  taxonomy_term { string label "Taxonomy term" }
  file { string label "File" }
  user { string label "User" }

  group }o--|| group_type : "type = community_group"
  group }o--|| file : "field_group_image"
  group }o--|| taxonomy_term : "field_group_type"

  group_relationship }o--|| group : "gid"
  group_relationship }o--|| group_relationship_type : "type"
  group_relationship }o--o{ group_role : "group_roles"
  group_relationship }o--|| node : "entity_id (when a content relationship)"
  group_relationship }o--|| user : "entity_id (when a membership)"

  group_relationship_type }o--|| group_type : "community_group"
  group_relationship_type }o--|| node_type : "documentation | event | forum | page | post"

  group_role }o--|| group_type : "community_group"

One group type is configured — community_group (“A community group for collaboration, discussion, and coordination”), with creator_membership: true and creator_wizard: true; the creator is auto-assigned the community_group-admin role.

Six group_relationship_types are configured, all scoped to community_group:

  • community_group-group_membership (content_plugin: group_membership) — the membership join.
  • Five content-relationship types, one per node bundle: group_node:documentation, group_node:event, group_node:forum, group_node:page, group_node:post.

One group_role is configured: community_group-admin.

The custom do_group_pin, do_multigroup, do_group_extras, do_group_mission, do_group_language, do_notifications, do_discovery, and do_profile_stats modules layered on top of this do not define any new entity types — they are behavioral and UI modules operating on this same core schema (pinning via Flag, cross-posting, archive/moderation rules, notifications, profile stats, language negotiation).

One inconsistency worth noting: a leftover boolean field node.section.group_group (“Determine if this is an OG group”) exists on the section content type. It is not wired to the actual Group entity system at all — it looks like an unmigrated artifact from a legacy Organic Groups (Drupal 7 predecessor to the group module) implementation that nothing currently reads.

See Group 3.3 to 4 Migration for what upgrading this schema to Group v4 would actually take.