dx-data-navigator

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

DX Data Navigator

DX 数据导航工具

Install

安装

bash
npx skills add pskoett/pskoett-ai-skills/dx-data-navigator
Query the DX Data Cloud PostgreSQL database using the
mcp__dx-mcp-server__queryData
tool.
bash
npx skills add pskoett/pskoett-ai-skills/dx-data-navigator
使用
mcp__dx-mcp-server__queryData
工具查询DX Data Cloud PostgreSQL数据库。

Tool Usage

工具使用

mcp__dx-mcp-server__queryData(sql: "SELECT ...")
Always query
information_schema.columns
first if uncertain about table/column names:
sql
SELECT column_name, data_type FROM information_schema.columns
WHERE table_name = 'table_name' ORDER BY ordinal_position;
mcp__dx-mcp-server__queryData(sql: "SELECT ...")
如果不确定表/列名称,请先查询
information_schema.columns
sql
SELECT column_name, data_type FROM information_schema.columns
WHERE table_name = 'table_name' ORDER BY ordinal_position;

Critical: Team Tables

重点:团队表

Three team table types exist - use the right one:
TableUse Case
dx_teams
Current org structure, linking users to teams for PR/deployment metrics
dx_snapshot_teams
Teams within DX survey snapshots (use for DX scores)
dx_versioned_teams
Historical team structure at specific dates
For DX survey scores: Join through
dx_snapshot_teams
. Use GROUP BY to avoid duplicates (team names can appear multiple times across snapshot history):
sql
SELECT st.name as team, i.name as metric, MAX(ts.score) as score, MAX(ts.vs_industry50) as vs_industry
FROM dx_snapshot_team_scores ts
JOIN dx_snapshot_teams st ON ts.snapshot_team_id = st.id
JOIN dx_snapshot_items i ON ts.item_id = i.id AND i.snapshot_id = ts.snapshot_id
WHERE ts.snapshot_id = (SELECT id FROM dx_snapshots ORDER BY end_date DESC LIMIT 1)
  AND st.name = 'Your Team Name'
  AND i.item_type = 'core4'
GROUP BY st.name, i.name;
For PR/deployment metrics by team: Join through
dx_users
to
dx_teams
:
sql
SELECT t.name, COUNT(*) as prs
FROM pull_requests p
JOIN dx_users u ON p.dx_user_id = u.id
JOIN dx_teams t ON u.team_id = t.id
WHERE p.merged IS NOT NULL GROUP BY t.name;
存在三种团队表类型,请选择合适的表:
表名适用场景
dx_teams
当前组织架构,关联用户与团队,用于PR/部署指标分析
dx_snapshot_teams
DX调研快照中的团队(用于查询DX分数)
dx_versioned_teams
特定日期的历史团队架构
查询DX调研分数: 通过
dx_snapshot_teams
进行关联。使用GROUP BY避免重复数据(团队名称可能在不同快照历史中多次出现):
sql
SELECT st.name as team, i.name as metric, MAX(ts.score) as score, MAX(ts.vs_industry50) as vs_industry
FROM dx_snapshot_team_scores ts
JOIN dx_snapshot_teams st ON ts.snapshot_team_id = st.id
JOIN dx_snapshot_items i ON ts.item_id = i.id AND i.snapshot_id = ts.snapshot_id
WHERE ts.snapshot_id = (SELECT id FROM dx_snapshots ORDER BY end_date DESC LIMIT 1)
  AND st.name = 'Your Team Name'
  AND i.item_type = 'core4'
GROUP BY st.name, i.name;
按团队查询PR/部署指标: 通过
dx_users
关联到
dx_teams
sql
SELECT t.name, COUNT(*) as prs
FROM pull_requests p
JOIN dx_users u ON p.dx_user_id = u.id
JOIN dx_teams t ON u.team_id = t.id
WHERE p.merged IS NOT NULL GROUP BY t.name;

Discovering Team Names

查找团队名称

Query the database to find available teams:
sql
SELECT name FROM dx_teams WHERE deleted_at IS NULL ORDER BY name;
查询数据库获取可用团队:
sql
SELECT name FROM dx_teams WHERE deleted_at IS NULL ORDER BY name;

Data Domains

数据域

Core DX Metrics

核心DX指标

Survey snapshots with team scores, benchmarks, and sentiment data.
Key tables:
dx_snapshots
,
dx_snapshot_teams
,
dx_snapshot_items
,
dx_snapshot_team_scores
dx_snapshots columns: id, account_id, contributors, participation_rate, start_date (date), end_date (date)
dx_snapshot_teams columns: id, snapshot_id, team_id, name, parent (boolean), flattened_parent, contributors, participation_rate
dx_snapshot_items columns: id, snapshot_id, name, item_type, prompt, target_label
dx_snapshot_team_scores columns: id, snapshot_id, snapshot_team_id (FK to dx_snapshot_teams.id), team_id (FK to dx_teams.id), item_id (FK to dx_snapshot_items.id), score, vs_org, vs_prev, vs_industry50, vs_industry75, vs_industry90, unit
Item types in dx_snapshot_items:
  • core4
    : Effectiveness, Impact, Quality, Speed
  • kpi
    : Ease of delivery, Engagement, Weekly time loss, Quality, Speed
  • sentiment
    : Deep work, Change Confidence, Documentation, Cross-team collaboration, Customer focus, Decision-making, etc.
  • workflow
    : Review wait time, CI wait time, Deploy frequency, PR merge frequency, AI time savings, Red tape, etc.
  • workflow_averages
    : Raw average values for workflow metrics (actual numbers, not percentiles)
  • csat
    : Tool satisfaction scores (e.g., code editors, issue trackers, CI/CD tools)
sql
-- Latest snapshot info
SELECT id, start_date, end_date, contributors, participation_rate
FROM dx_snapshots ORDER BY end_date DESC LIMIT 1;

-- Team scores for specific metric (use GROUP BY to dedupe)
SELECT st.name as team, i.name as metric, MAX(ts.score) as score, MAX(ts.vs_industry50) as vs_industry
FROM dx_snapshot_team_scores ts
JOIN dx_snapshot_teams st ON ts.snapshot_team_id = st.id
JOIN dx_snapshot_items i ON ts.item_id = i.id AND i.snapshot_id = ts.snapshot_id
WHERE ts.snapshot_id = (SELECT id FROM dx_snapshots ORDER BY end_date DESC LIMIT 1)
  AND st.name = 'Your Team Name'
  AND i.item_type = 'core4'
GROUP BY st.name, i.name;

-- All teams comparison on one metric
SELECT st.name as team, MAX(ts.score) as score, MAX(ts.vs_industry50) as vs_industry
FROM dx_snapshot_team_scores ts
JOIN dx_snapshot_teams st ON ts.snapshot_team_id = st.id
JOIN dx_snapshot_items i ON ts.item_id = i.id AND i.snapshot_id = ts.snapshot_id
WHERE ts.snapshot_id = (SELECT id FROM dx_snapshots ORDER BY end_date DESC LIMIT 1)
  AND i.name = 'Effectiveness' AND i.item_type = 'core4'
  AND st.parent = false
GROUP BY st.name
ORDER BY score DESC NULLS LAST;
包含团队分数、基准和情绪数据的调研快照。
关键表:
dx_snapshots
,
dx_snapshot_teams
,
dx_snapshot_items
,
dx_snapshot_team_scores
dx_snapshots列: id, account_id, contributors, participation_rate, start_date (date), end_date (date)
dx_snapshot_teams列: id, snapshot_id, team_id, name, parent (boolean), flattened_parent, contributors, participation_rate
dx_snapshot_items列: id, snapshot_id, name, item_type, prompt, target_label
dx_snapshot_team_scores列: id, snapshot_id, snapshot_team_id (FK to dx_snapshot_teams.id), team_id (FK to dx_teams.id), item_id (FK to dx_snapshot_items.id), score, vs_org, vs_prev, vs_industry50, vs_industry75, vs_industry90, unit
dx_snapshot_items中的item类型:
  • core4
    : 效能、影响力、质量、速度
  • kpi
    : 交付便捷性、参与度、每周时间损耗、质量、速度
  • sentiment
    : 深度工作、变革信心、文档、跨团队协作、客户聚焦、决策制定等
  • workflow
    : 评审等待时间、CI等待时间、部署频率、PR合并频率、AI时间节省、冗余流程等
  • workflow_averages
    : 工作流指标的原始平均值(实际数值,而非百分位数)
  • csat
    : 工具满意度分数(如代码编辑器、问题追踪器、CI/CD工具)
sql
-- 最新快照信息
SELECT id, start_date, end_date, contributors, participation_rate
FROM dx_snapshots ORDER BY end_date DESC LIMIT 1;

-- 特定指标的团队分数(使用GROUP BY去重)
SELECT st.name as team, i.name as metric, MAX(ts.score) as score, MAX(ts.vs_industry50) as vs_industry
FROM dx_snapshot_team_scores ts
JOIN dx_snapshot_teams st ON ts.snapshot_team_id = st.id
JOIN dx_snapshot_items i ON ts.item_id = i.id AND i.snapshot_id = ts.snapshot_id
WHERE ts.snapshot_id = (SELECT id FROM dx_snapshots ORDER BY end_date DESC LIMIT 1)
  AND st.name = 'Your Team Name'
  AND i.item_type = 'core4'
GROUP BY st.name, i.name;

-- 所有团队在单一指标上的对比
SELECT st.name as team, MAX(ts.score) as score, MAX(ts.vs_industry50) as vs_industry
FROM dx_snapshot_team_scores ts
JOIN dx_snapshot_teams st ON ts.snapshot_team_id = st.id
JOIN dx_snapshot_items i ON ts.item_id = i.id AND i.snapshot_id = ts.snapshot_id
WHERE ts.snapshot_id = (SELECT id FROM dx_snapshots ORDER BY end_date DESC LIMIT 1)
  AND i.name = 'Effectiveness' AND i.item_type = 'core4'
  AND st.parent = false
GROUP BY st.name
ORDER BY score DESC NULLS LAST;

Teams and Users

团队与用户

Organization structure, team hierarchies, user profiles.
Key tables:
dx_teams
,
dx_users
,
dx_team_hierarchies
,
dx_groups
dx_teams columns: id, name, contributors, deleted_at
dx_users key columns: id, name, email, team_id, ai_light_adoption_date, ai_moderate_adoption_date, ai_heavy_adoption_date
sql
-- Teams with contributor counts
SELECT name, contributors FROM dx_teams WHERE deleted_at IS NULL ORDER BY contributors DESC;

-- Users with AI adoption status
SELECT name, email, ai_heavy_adoption_date FROM dx_users
WHERE ai_heavy_adoption_date IS NOT NULL ORDER BY ai_heavy_adoption_date DESC;

-- Team members
SELECT u.name, u.email FROM dx_users u
JOIN dx_teams t ON u.team_id = t.id
WHERE t.name = 'Your Team Name';
组织架构、团队层级、用户资料。
关键表:
dx_teams
,
dx_users
,
dx_team_hierarchies
,
dx_groups
dx_teams列: id, name, contributors, deleted_at
dx_users关键列: id, name, email, team_id, ai_light_adoption_date, ai_moderate_adoption_date, ai_heavy_adoption_date
sql
-- 包含贡献者数量的团队列表
SELECT name, contributors FROM dx_teams WHERE deleted_at IS NULL ORDER BY contributors DESC;

-- 具有AI采用状态的用户
SELECT name, email, ai_heavy_adoption_date FROM dx_users
WHERE ai_heavy_adoption_date IS NOT NULL ORDER BY ai_heavy_adoption_date DESC;

-- 团队成员
SELECT u.name, u.email FROM dx_users u
JOIN dx_teams t ON u.team_id = t.id
WHERE t.name = 'Your Team Name';

Pull Requests

拉取请求(PR)

PR metrics including cycle times, review wait times, and throughput.
Key tables:
pull_requests
,
pull_request_reviews
,
repos
pull_requests key columns: id, dx_user_id, repo_id, title, base_ref, head_ref, additions, deletions, created, merged, closed, draft, bot_authored
Key metrics (all in seconds, divide by 3600 for hours):
  • open_to_merge
    : Total PR cycle time
  • open_to_first_review
    : Time to first review
  • open_to_first_approval
    : Time to approval
  • Business hour variants: add
    _business_hours
    suffix
sql
-- PR metrics by team last 30 days
SELECT t.name, COUNT(*) as prs,
       AVG(p.open_to_merge)/3600 as avg_hours_to_merge,
       AVG(p.open_to_first_review)/3600 as avg_hours_to_first_review
FROM pull_requests p
JOIN dx_users u ON p.dx_user_id = u.id
JOIN dx_teams t ON u.team_id = t.id
WHERE p.merged IS NOT NULL AND p.created > NOW() - INTERVAL '30 days'
GROUP BY t.name ORDER BY prs DESC;

-- PR size distribution
SELECT
    CASE
        WHEN additions + deletions < 50 THEN 'XS (<50)'
        WHEN additions + deletions < 200 THEN 'S (50-199)'
        WHEN additions + deletions < 500 THEN 'M (200-499)'
        ELSE 'L (500+)'
    END as size_bucket,
    COUNT(*) as count,
    AVG(open_to_merge)/3600 as avg_hours
FROM pull_requests
WHERE merged IS NOT NULL AND created > NOW() - INTERVAL '90 days'
GROUP BY size_bucket ORDER BY avg_hours;
PR指标包括周期时间、评审等待时间和吞吐量。
关键表:
pull_requests
,
pull_request_reviews
,
repos
pull_requests关键列: id, dx_user_id, repo_id, title, base_ref, head_ref, additions, deletions, created, merged, closed, draft, bot_authored
关键指标(单位:秒,除以3600转换为小时):
  • open_to_merge
    : PR总周期时间
  • open_to_first_review
    : 首次评审等待时间
  • open_to_first_approval
    : 首次批准等待时间
  • 工作时间变体:添加
    _business_hours
    后缀
sql
-- 过去30天的团队PR指标
SELECT t.name, COUNT(*) as prs,
       AVG(p.open_to_merge)/3600 as avg_hours_to_merge,
       AVG(p.open_to_first_review)/3600 as avg_hours_to_first_review
FROM pull_requests p
JOIN dx_users u ON p.dx_user_id = u.id
JOIN dx_teams t ON u.team_id = t.id
WHERE p.merged IS NOT NULL AND p.created > NOW() - INTERVAL '30 days'
GROUP BY t.name ORDER BY prs DESC;

-- PR大小分布
SELECT
    CASE
        WHEN additions + deletions < 50 THEN 'XS (<50)'
        WHEN additions + deletions < 200 THEN 'S (50-199)'
        WHEN additions + deletions < 500 THEN 'M (200-499)'
        ELSE 'L (500+)'
    END as size_bucket,
    COUNT(*) as count,
    AVG(open_to_merge)/3600 as avg_hours
FROM pull_requests
WHERE merged IS NOT NULL AND created > NOW() - INTERVAL '90 days'
GROUP BY size_bucket ORDER BY avg_hours;

Deployments and Incidents

部署与事件

Deployment frequency, success rates, and incident tracking for DORA metrics.
Key tables:
deployments
,
incidents
,
incident_services
deployments columns: id, service, repository, environment, deployed_at, success, commit_sha
incidents columns: id, name, priority, source, source_url, started_at, resolved_at, started_to_resolved (seconds), deleted
Deployment environments: dev, stage, prod, production Incident priorities: '1 - Critical', '2 - High', '3 - Moderate', '4 - Low', '5 - Planning' Incident source: Check
SELECT DISTINCT source FROM incidents
for available sources
sql
-- Deploy frequency by environment
SELECT environment, COUNT(*) FROM deployments
WHERE deployed_at > NOW() - INTERVAL '30 days' GROUP BY environment;

-- Deployment success rate
SELECT
    COUNT(*) as total,
    COUNT(*) FILTER (WHERE success) as successful,
    COUNT(*) FILTER (WHERE success)::float / COUNT(*) * 100 as success_rate
FROM deployments WHERE deployed_at > NOW() - INTERVAL '30 days';

-- Mean Time to Recovery (MTTR)
SELECT AVG(started_to_resolved)/3600 as avg_hours_to_resolve
FROM incidents
WHERE resolved_at IS NOT NULL AND priority IN ('1 - Critical', '2 - High');

-- Incidents by priority
SELECT priority, COUNT(*) FROM incidents
WHERE started_at > NOW() - INTERVAL '90 days' AND deleted = false
GROUP BY priority ORDER BY priority;
部署频率、成功率,以及用于DORA指标的事件追踪。
关键表:
deployments
,
incidents
,
incident_services
deployments列: id, service, repository, environment, deployed_at, success, commit_sha
incidents列: id, name, priority, source, source_url, started_at, resolved_at, started_to_resolved (seconds), deleted
部署环境: dev, stage, prod, production 事件优先级: '1 - Critical', '2 - High', '3 - Moderate', '4 - Low', '5 - Planning' 事件来源: 查询
SELECT DISTINCT source FROM incidents
获取可用来源
sql
-- 按环境统计部署频率
SELECT environment, COUNT(*) FROM deployments
WHERE deployed_at > NOW() - INTERVAL '30 days' GROUP BY environment;

-- 部署成功率
SELECT
    COUNT(*) as total,
    COUNT(*) FILTER (WHERE success) as successful,
    COUNT(*) FILTER (WHERE success)::float / COUNT(*) * 100 as success_rate
FROM deployments WHERE deployed_at > NOW() - INTERVAL '30 days';

-- 平均恢复时间(MTTR)
SELECT AVG(started_to_resolved)/3600 as avg_hours_to_resolve
FROM incidents
WHERE resolved_at IS NOT NULL AND priority IN ('1 - Critical', '2 - High');

-- 按优先级统计事件
SELECT priority, COUNT(*) FROM incidents
WHERE started_at > NOW() - INTERVAL '90 days' AND deleted = false
GROUP BY priority ORDER BY priority;

AI Tools

AI工具

AI coding assistant adoption tracking (e.g., GitHub Copilot).
Key tables:
ai_tools
,
ai_tool_daily_metrics
,
github_copilot_daily_usages
,
github_users
github_copilot_daily_usages columns: id, login, date, enterprise_slug, active (boolean)
github_users columns: id, login, verified_emails, bot, active
Linking Copilot to teams: GitHub logins don't match DX user emails directly. Use
github_users.verified_emails
to link:
sql
-- Copilot usage by team (via github_users email linking)
SELECT t.name as team, COUNT(DISTINCT c.login) as active_copilot_users
FROM github_copilot_daily_usages c
JOIN github_users gu ON c.login = gu.login
JOIN dx_users u ON gu.verified_emails = u.email
JOIN dx_teams t ON u.team_id = t.id
WHERE c.date > NOW() - INTERVAL '30 days' AND c.active = true
GROUP BY t.name ORDER BY active_copilot_users DESC;
sql
-- Daily Copilot active users (overall)
SELECT date, COUNT(*) FILTER (WHERE active) as active_users
FROM github_copilot_daily_usages
WHERE date > NOW() - INTERVAL '30 days'
GROUP BY date ORDER BY date;

-- Copilot adoption rate (latest day)
SELECT
    COUNT(DISTINCT login) FILTER (WHERE active) as active_users,
    COUNT(DISTINCT login) as total_users,
    COUNT(DISTINCT login) FILTER (WHERE active)::float / COUNT(DISTINCT login) * 100 as adoption_pct
FROM github_copilot_daily_usages
WHERE date = (SELECT MAX(date) FROM github_copilot_daily_usages);

-- Weekly trend
SELECT DATE_TRUNC('week', date) as week,
       COUNT(DISTINCT login) FILTER (WHERE active) as active_users
FROM github_copilot_daily_usages
WHERE date > NOW() - INTERVAL '90 days'
GROUP BY week ORDER BY week;
AI编码助手采用情况追踪(如GitHub Copilot)。
关键表:
ai_tools
,
ai_tool_daily_metrics
,
github_copilot_daily_usages
,
github_users
github_copilot_daily_usages列: id, login, date, enterprise_slug, active (boolean)
github_users列: id, login, verified_emails, bot, active
关联Copilot与团队: GitHub登录名与DX用户邮箱不直接匹配。使用
github_users.verified_emails
进行关联:
sql
-- 按团队统计Copilot使用情况(通过github_users邮箱关联)
SELECT t.name as team, COUNT(DISTINCT c.login) as active_copilot_users
FROM github_copilot_daily_usages c
JOIN github_users gu ON c.login = gu.login
JOIN dx_users u ON gu.verified_emails = u.email
JOIN dx_teams t ON u.team_id = t.id
WHERE c.date > NOW() - INTERVAL '30 days' AND c.active = true
GROUP BY t.name ORDER BY active_copilot_users DESC;
sql
-- 每日Copilot活跃用户数(整体)
SELECT date, COUNT(*) FILTER (WHERE active) as active_users
FROM github_copilot_daily_usages
WHERE date > NOW() - INTERVAL '30 days'
GROUP BY date ORDER BY date;

-- Copilot采用率(最新一日)
SELECT
    COUNT(DISTINCT login) FILTER (WHERE active) as active_users,
    COUNT(DISTINCT login) as total_users,
    COUNT(DISTINCT login) FILTER (WHERE active)::float / COUNT(DISTINCT login) * 100 as adoption_pct
FROM github_copilot_daily_usages
WHERE date = (SELECT MAX(date) FROM github_copilot_daily_usages);

-- 周趋势
SELECT DATE_TRUNC('week', date) as week,
       COUNT(DISTINCT login) FILTER (WHERE active) as active_users
FROM github_copilot_daily_usages
WHERE date > NOW() - INTERVAL '90 days'
GROUP BY week ORDER BY week;

Issue Tracking

问题追踪

Project management data including issues, sprints, and cycle times (e.g., Jira).
Key tables:
jira_issues
,
jira_projects
,
jira_sprints
,
jira_issue_sprints
,
jira_issue_types
,
jira_statuses
jira_issues key columns: id, key, summary, story_points, cycle_time (seconds), created_at, completed_at, project_id, status_id, issue_type_id, user_id
jira_sprints columns: id, name, state ('active', 'closed', 'future'), start_date, end_date, complete_date
sql
-- Sprint velocity (last 5 closed sprints)
SELECT s.name, SUM(i.story_points) as points, COUNT(*) as issues
FROM jira_sprints s
JOIN jira_issue_sprints jis ON s.id = jis.sprint_id
JOIN jira_issues i ON jis.issue_id = i.id
WHERE s.state = 'closed' AND i.completed_at IS NOT NULL
GROUP BY s.id, s.name ORDER BY s.complete_date DESC LIMIT 5;

-- Issue cycle time by type
SELECT it.name as issue_type, COUNT(*) as issues, AVG(i.cycle_time)/3600 as avg_hours
FROM jira_issues i
JOIN jira_issue_types it ON i.issue_type_id = it.id
WHERE i.completed_at IS NOT NULL AND i.completed_at > NOW() - INTERVAL '90 days'
GROUP BY it.name ORDER BY issues DESC;
项目管理数据,包括问题、迭代和周期时间(如Jira)。
关键表:
jira_issues
,
jira_projects
,
jira_sprints
,
jira_issue_sprints
,
jira_issue_types
,
jira_statuses
jira_issues关键列: id, key, summary, story_points, cycle_time (seconds), created_at, completed_at, project_id, status_id, issue_type_id, user_id
jira_sprints列: id, name, state ('active', 'closed', 'future'), start_date, end_date, complete_date
sql
-- 最近5个已关闭迭代의速度
SELECT s.name, SUM(i.story_points) as points, COUNT(*) as issues
FROM jira_sprints s
JOIN jira_issue_sprints jis ON s.id = jis.sprint_id
JOIN jira_issues i ON jis.issue_id = i.id
WHERE s.state = 'closed' AND i.completed_at IS NOT NULL
GROUP BY s.id, s.name ORDER BY s.complete_date DESC LIMIT 5;

-- 按问题类型统计周期时间
SELECT it.name as issue_type, COUNT(*) as issues, AVG(i.cycle_time)/3600 as avg_hours
FROM jira_issues i
JOIN jira_issue_types it ON i.issue_type_id = it.id
WHERE i.completed_at IS NOT NULL AND i.completed_at > NOW() - INTERVAL '90 days'
GROUP BY it.name ORDER BY issues DESC;

Service Catalog

服务目录

Software catalog with services, teams, domains, and ownership.
Key tables:
dx_catalog_entities
,
dx_catalog_entity_owners
,
dx_catalog_entity_types
dx_catalog_entities columns: id, name, identifier, entity_type_identifier, description
Entity types: service, team, domain (check
entity_type_identifier
column)
sql
-- Services count by owning team
SELECT t.name as team, COUNT(*) as services
FROM dx_catalog_entity_owners eo
JOIN dx_catalog_entities e ON eo.entity_id = e.id
JOIN dx_teams t ON eo.team_id = t.id
WHERE e.entity_type_identifier = 'service'
GROUP BY t.name ORDER BY services DESC;

-- List services with owners
SELECT e.name as service, e.identifier, t.name as owner_team
FROM dx_catalog_entities e
JOIN dx_catalog_entity_owners eo ON e.id = eo.entity_id
JOIN dx_teams t ON eo.team_id = t.id
WHERE e.entity_type_identifier = 'service'
ORDER BY t.name, e.name;
包含服务、团队、领域和所有权的软件目录。
关键表:
dx_catalog_entities
,
dx_catalog_entity_owners
,
dx_catalog_entity_types
dx_catalog_entities列: id, name, identifier, entity_type_identifier, description
实体类型: service, team, domain(查看
entity_type_identifier
列)
sql
-- 按负责团队统计服务数量
SELECT t.name as team, COUNT(*) as services
FROM dx_catalog_entity_owners eo
JOIN dx_catalog_entities e ON eo.entity_id = e.id
JOIN dx_teams t ON eo.team_id = t.id
WHERE e.entity_type_identifier = 'service'
GROUP BY t.name ORDER BY services DESC;

-- 列出带有负责人的服务
SELECT e.name as service, e.identifier, t.name as owner_team
FROM dx_catalog_entities e
JOIN dx_catalog_entity_owners eo ON e.id = eo.entity_id
JOIN dx_teams t ON eo.team_id = t.id
WHERE e.entity_type_identifier = 'service'
ORDER BY t.name, e.name;

Pipelines and Code Quality

流水线与代码质量

CI/CD pipeline runs and code quality metrics (e.g., SonarCloud).
Key tables:
pipeline_runs
,
sonarcloud_issues
,
sonarcloud_projects
,
sonarcloud_project_metrics
pipeline_runs columns: id, status, started_at, completed_at, duration
sql
-- Pipeline success rate
SELECT COUNT(*) as runs,
       COUNT(*) FILTER (WHERE status = 'success') as successful,
       COUNT(*) FILTER (WHERE status = 'success') * 100.0 / COUNT(*) as success_pct
FROM pipeline_runs WHERE started_at > NOW() - INTERVAL '30 days';

-- Pipeline duration trend
SELECT DATE_TRUNC('week', started_at) as week,
       AVG(duration)/60 as avg_minutes
FROM pipeline_runs WHERE started_at > NOW() - INTERVAL '90 days'
GROUP BY week ORDER BY week;
CI/CD流水线运行和代码质量指标(如SonarCloud)。
关键表:
pipeline_runs
,
sonarcloud_issues
,
sonarcloud_projects
,
sonarcloud_project_metrics
pipeline_runs列: id, status, started_at, completed_at, duration
sql
-- 流水线成功率
SELECT COUNT(*) as runs,
       COUNT(*) FILTER (WHERE status = 'success') as successful,
       COUNT(*) FILTER (WHERE status = 'success') * 100.0 / COUNT(*) as success_pct
FROM pipeline_runs WHERE started_at > NOW() - INTERVAL '30 days';

-- 流水线时长趋势
SELECT DATE_TRUNC('week', started_at) as week,
       AVG(duration)/60 as avg_minutes
FROM pipeline_runs WHERE started_at > NOW() - INTERVAL '90 days'
GROUP BY week ORDER BY week;

Issues

问题

Normalized issue data from source control platforms (e.g., GitHub Issues).
Key tables:
issues
,
github_issues
,
github_issue_labels
,
github_labels
issues columns: id, source, dx_user_id, title, state, created, completed, cycle_time
sql
-- Issue throughput
SELECT DATE_TRUNC('week', completed) as week, COUNT(*) as completed
FROM issues WHERE completed > NOW() - INTERVAL '90 days'
GROUP BY week ORDER BY week;
来自源码控制平台的标准化问题数据(如GitHub Issues)。
关键表:
issues
,
github_issues
,
github_issue_labels
,
github_labels
issues列: id, source, dx_user_id, title, state, created, completed, cycle_time
sql
-- 问题吞吐量
SELECT DATE_TRUNC('week', completed) as week, COUNT(*) as completed
FROM issues WHERE completed > NOW() - INTERVAL '90 days'
GROUP BY week ORDER BY week;

Documentation

文档

Documentation and knowledge base activity (e.g., Confluence, wikis).
Key tables:
confluence_spaces
,
confluence_pages
,
confluence_page_versions
,
confluence_users
,
confluence_page_labels
confluence_spaces columns: id, name, external_key, space_type, status, source_url, created_at
confluence_pages columns: id, space_id, author_id, title, status, views_count, created_at, updated_at
confluence_page_versions columns: id, page_id, version_number, author_id, created_at
sql
-- Most active Confluence spaces
SELECT s.name as space_name, s.external_key,
       COUNT(DISTINCT p.id) as page_count,
       COUNT(DISTINCT pv.id) as total_edits,
       MAX(pv.created_at) as last_activity
FROM confluence_spaces s
LEFT JOIN confluence_pages p ON s.id = p.space_id
LEFT JOIN confluence_page_versions pv ON p.id = pv.page_id
GROUP BY s.id, s.name, s.external_key
ORDER BY total_edits DESC LIMIT 15;

-- Recent documentation activity
SELECT p.title, s.name as space, pv.created_at
FROM confluence_page_versions pv
JOIN confluence_pages p ON pv.page_id = p.id
JOIN confluence_spaces s ON p.space_id = s.id
WHERE pv.created_at > NOW() - INTERVAL '7 days'
ORDER BY pv.created_at DESC LIMIT 20;
文档与知识库活动(如Confluence、维基)。
关键表:
confluence_spaces
,
confluence_pages
,
confluence_page_versions
,
confluence_users
,
confluence_page_labels
confluence_spaces列: id, name, external_key, space_type, status, source_url, created_at
confluence_pages列: id, space_id, author_id, title, status, views_count, created_at, updated_at
confluence_page_versions列: id, page_id, version_number, author_id, created_at
sql
-- 最活跃的Confluence空间
SELECT s.name as space_name, s.external_key,
       COUNT(DISTINCT p.id) as page_count,
       COUNT(DISTINCT pv.id) as total_edits,
       MAX(pv.created_at) as last_activity
FROM confluence_spaces s
LEFT JOIN confluence_pages p ON s.id = p.space_id
LEFT JOIN confluence_page_versions pv ON p.id = pv.page_id
GROUP BY s.id, s.name, s.external_key
ORDER BY total_edits DESC LIMIT 15;

-- 近期文档活动
SELECT p.title, s.name as space, pv.created_at
FROM confluence_page_versions pv
JOIN confluence_pages p ON pv.page_id = p.id
JOIN confluence_spaces s ON p.space_id = s.id
WHERE pv.created_at > NOW() - INTERVAL '7 days'
ORDER BY pv.created_at DESC LIMIT 20;

Data Quality Notes

数据质量说明

Known issues:
  • Some team names may have typos - verify names by querying
    dx_teams
  • incident_services
    table is empty - incidents cannot be linked to specific services
  • dx_users
    AI adoption date fields are mostly NULL - use
    github_copilot_daily_usages
    instead
  • DX survey scores may have duplicates - always use GROUP BY with MAX() aggregation
已知问题:
  • 部分团队名称可能存在拼写错误 - 通过查询
    dx_teams
    验证名称
  • incident_services
    表为空 - 事件无法关联到特定服务
  • dx_users
    中的AI采用日期字段大多为NULL - 请使用
    github_copilot_daily_usages
    替代
  • DX调研分数可能存在重复 - 请始终结合GROUP BY与MAX()聚合函数使用

Common Query Patterns

常见查询模式

DORA Metrics

DORA指标

sql
-- Deployment Frequency (daily average, production only)
SELECT COUNT(*)::float / 30 as deploys_per_day FROM deployments
WHERE deployed_at > NOW() - INTERVAL '30 days' AND environment IN ('prod', 'production');

-- Lead Time for Changes (PR cycle time)
SELECT
    AVG(open_to_merge)/3600 as avg_hours,
    PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY open_to_merge)/3600 as median_hours
FROM pull_requests
WHERE merged IS NOT NULL AND created > NOW() - INTERVAL '30 days';

-- Mean Time to Recovery
SELECT AVG(started_to_resolved)/3600 as mttr_hours FROM incidents
WHERE resolved_at IS NOT NULL AND priority IN ('1 - Critical', '2 - High')
  AND started_at > NOW() - INTERVAL '90 days';

-- Change Failure Rate (requires correlating incidents with deployments)
sql
-- 部署频率(日均,仅生产环境)
SELECT COUNT(*)::float / 30 as deploys_per_day FROM deployments
WHERE deployed_at > NOW() - INTERVAL '30 days' AND environment IN ('prod', 'production');

-- 变更前置时间(PR周期时间)
SELECT
    AVG(open_to_merge)/3600 as avg_hours,
    PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY open_to_merge)/3600 as median_hours
FROM pull_requests
WHERE merged IS NOT NULL AND created > NOW() - INTERVAL '30 days';

-- 平均恢复时间
SELECT AVG(started_to_resolved)/3600 as mttr_hours FROM incidents
WHERE resolved_at IS NOT NULL AND priority IN ('1 - Critical', '2 - High')
  AND started_at > NOW() - INTERVAL '90 days';

-- 变更失败率(需要关联事件与部署)

Time-based Trends

基于时间的趋势

sql
-- Weekly PR throughput trend
SELECT DATE_TRUNC('week', merged) as week, COUNT(*) as prs
FROM pull_requests WHERE merged > NOW() - INTERVAL '90 days'
GROUP BY week ORDER BY week;

-- Monthly deployment trend
SELECT DATE_TRUNC('month', deployed_at) as month, COUNT(*) as deploys
FROM deployments WHERE deployed_at > NOW() - INTERVAL '12 months'
GROUP BY month ORDER BY month;
sql
-- 每周PR吞吐量趋势
SELECT DATE_TRUNC('week', merged) as week, COUNT(*) as prs
FROM pull_requests WHERE merged > NOW() - INTERVAL '90 days'
GROUP BY week ORDER BY week;

-- 每月部署趋势
SELECT DATE_TRUNC('month', deployed_at) as month, COUNT(*) as deploys
FROM deployments WHERE deployed_at > NOW() - INTERVAL '12 months'
GROUP BY month ORDER BY month;

Historical DX Survey Comparison

历史DX调研对比

sql
-- Compare team scores across all surveys
SELECT s.end_date as survey_date, i.name as metric, ts.score
FROM dx_snapshot_team_scores ts
JOIN dx_snapshots s ON ts.snapshot_id = s.id
JOIN dx_snapshot_teams st ON ts.snapshot_team_id = st.id AND st.snapshot_id = s.id
JOIN dx_snapshot_items i ON ts.item_id = i.id AND i.snapshot_id = s.id
WHERE st.name = 'Your Team Name'
  AND i.item_type = 'core4'
  AND ts.score IS NOT NULL
ORDER BY s.end_date, i.name;

-- Teams that improved most since last survey (use vs_prev)
SELECT st.name as team, i.name as metric, MAX(ts.score) as score, MAX(ts.vs_prev) as change
FROM dx_snapshot_team_scores ts
JOIN dx_snapshot_teams st ON ts.snapshot_team_id = st.id
JOIN dx_snapshot_items i ON ts.item_id = i.id AND i.snapshot_id = ts.snapshot_id
WHERE ts.snapshot_id = (SELECT id FROM dx_snapshots ORDER BY end_date DESC LIMIT 1)
  AND i.name = 'Effectiveness' AND i.item_type = 'core4'
  AND st.parent = false
GROUP BY st.name, i.name
ORDER BY change DESC NULLS LAST;
sql
-- 对比团队在所有调研中的分数
SELECT s.end_date as survey_date, i.name as metric, ts.score
FROM dx_snapshot_team_scores ts
JOIN dx_snapshots s ON ts.snapshot_id = s.id
JOIN dx_snapshot_teams st ON ts.snapshot_team_id = st.id AND st.snapshot_id = s.id
JOIN dx_snapshot_items i ON ts.item_id = i.id AND i.snapshot_id = s.id
WHERE st.name = 'Your Team Name'
  AND i.item_type = 'core4'
  AND ts.score IS NOT NULL
ORDER BY s.end_date, i.name;

-- 自上次调研以来进步最大的团队(使用vs_prev)
SELECT st.name as team, i.name as metric, MAX(ts.score) as score, MAX(ts.vs_prev) as change
FROM dx_snapshot_team_scores ts
JOIN dx_snapshot_teams st ON ts.snapshot_team_id = st.id
JOIN dx_snapshot_items i ON ts.item_id = i.id AND i.snapshot_id = ts.snapshot_id
WHERE ts.snapshot_id = (SELECT id FROM dx_snapshots ORDER BY end_date DESC LIMIT 1)
  AND i.name = 'Effectiveness' AND i.item_type = 'core4'
  AND st.parent = false
GROUP BY st.name, i.name
ORDER BY change DESC NULLS LAST;

Tool Satisfaction Analysis

工具满意度分析

sql
-- Tool satisfaction scores (csat)
SELECT i.name as tool, AVG(ts.score) as avg_satisfaction, COUNT(DISTINCT st.name) as teams_using
FROM dx_snapshot_team_scores ts
JOIN dx_snapshot_teams st ON ts.snapshot_team_id = st.id
JOIN dx_snapshot_items i ON ts.item_id = i.id AND i.snapshot_id = ts.snapshot_id
WHERE ts.snapshot_id = (SELECT id FROM dx_snapshots ORDER BY end_date DESC LIMIT 1)
  AND i.item_type = 'csat' AND st.parent = false AND ts.score IS NOT NULL
GROUP BY i.name ORDER BY avg_satisfaction ASC;
sql
-- 工具满意度分数(csat)
SELECT i.name as tool, AVG(ts.score) as avg_satisfaction, COUNT(DISTINCT st.name) as teams_using
FROM dx_snapshot_team_scores ts
JOIN dx_snapshot_teams st ON ts.snapshot_team_id = st.id
JOIN dx_snapshot_items i ON ts.item_id = i.id AND i.snapshot_id = ts.snapshot_id
WHERE ts.snapshot_id = (SELECT id FROM dx_snapshots ORDER BY end_date DESC LIMIT 1)
  AND i.item_type = 'csat' AND st.parent = false AND ts.score IS NOT NULL
GROUP BY i.name ORDER BY avg_satisfaction ASC;

Reference Files

参考文档

For detailed schema documentation, read these files:
DomainFileWhen to read
DX Surveys/Scoresreferences/developer-experience.mdSurvey data, snapshots, team scores, sentiment
Teams/Usersreferences/teams-users.mdTeam structure, user profiles, AI adoption dates
Pull Requestsreferences/pull-requests.mdPR metrics, reviews, cycle times
Deploymentsreferences/deployments-incidents.mdDeploy frequency, incidents, DORA metrics
AI Toolsreferences/ai-tools.mdAI assistant usage, adoption tracking
Issue Trackingreferences/jira.mdIssues, sprints, story points
Catalogreferences/catalog.mdServices, ownership, domains
Pipelines/Qualityreferences/pipelines-quality.mdCI/CD runs, code quality issues
Issuesreferences/issues-github.mdSource control issues, labels
如需详细的架构文档,请阅读以下文件:
领域文件阅读场景
DX调研/分数references/developer-experience.md调研数据、快照、团队分数、情绪分析
团队/用户references/teams-users.md团队架构、用户资料、AI采用日期
拉取请求references/pull-requests.mdPR指标、评审、周期时间
部署references/deployments-incidents.md部署频率、事件、DORA指标
AI工具references/ai-tools.mdAI助手使用情况、采用追踪
问题追踪references/jira.md问题、迭代、故事点
目录references/catalog.md服务、所有权、领域
流水线/质量references/pipelines-quality.mdCI/CD运行、代码质量问题
问题references/issues-github.md源码控制问题、标签