Files
ruoyi-vue-pro/sql/mysql/education/008-education-catalog.sql

350 lines
23 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- =============================================
-- Education 模块 — 题库目录原生表 DDL
-- Ticket #20: 原生实现题库目录浏览,替换 Scalar adapter
-- Migration: 008
-- Prerequisites: 000-education-schema.sql (database creation)
-- 001-education-tenant-seed.sql (tenant seed data)
-- =============================================
-- =============================================
-- Preconditions
-- =============================================
-- Verify none of these tables already exist:
-- SELECT TABLE_NAME FROM information_schema.tables
-- WHERE table_schema = DATABASE()
-- AND TABLE_NAME IN (
-- 'education_region', 'education_school', 'education_major',
-- 'education_subject', 'education_category',
-- 'education_content_entry', 'education_content_node',
-- 'education_question_collection', 'education_question',
-- 'education_practice_blueprint', 'education_question_collection_question'
-- );
-- Result MUST be 0 before executing this migration.
-- =============================================
-- 1. 地区表
-- =============================================
-- Indexes:
-- idx_tenant — tenant-scoped queries (tenant-aware interceptor default)
-- idx_tenant_active_order — active region listing ordered by display order
CREATE TABLE `education_region` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
`tenant_id` BIGINT NOT NULL COMMENT '租户编号',
`legacy_id` VARCHAR(64) DEFAULT NULL COMMENT '旧系统地区 ID',
`name` VARCHAR(100) NOT NULL COMMENT '地区名称',
`code` VARCHAR(32) DEFAULT NULL COMMENT '地区编码',
`short_name` VARCHAR(50) DEFAULT NULL COMMENT '地区简称',
`full_name` VARCHAR(200) DEFAULT NULL COMMENT '地区全称',
`icon` VARCHAR(500) DEFAULT NULL COMMENT '地区图标 URL',
`pinyin` VARCHAR(200) DEFAULT NULL COMMENT '地区拼音',
`is_hot` BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否热门地区',
`is_active` BIT(1) NOT NULL DEFAULT b'1' COMMENT '是否启用',
`sort_order` INT NOT NULL DEFAULT 0 COMMENT '显示排序值',
`creator` VARCHAR(64) DEFAULT '' COMMENT '创建者',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` VARCHAR(64) DEFAULT '' COMMENT '更新者',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`),
KEY `idx_tenant` (`tenant_id`),
KEY `idx_tenant_active_order` (`tenant_id`, `is_active`, `sort_order`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='教育-地区';
-- =============================================
-- 2. 院校表
-- =============================================
CREATE TABLE `education_school` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
`tenant_id` BIGINT NOT NULL COMMENT '租户编号',
`legacy_id` VARCHAR(64) DEFAULT NULL COMMENT '旧系统院校 ID',
`region_id` BIGINT DEFAULT NULL COMMENT '地区 ID',
`module_id` BIGINT DEFAULT NULL COMMENT '地区模块 ID',
`name` VARCHAR(200) NOT NULL COMMENT '院校名称',
`professional_exam_date` VARCHAR(200) DEFAULT NULL COMMENT '专业考试日期说明',
`metadata` JSON DEFAULT NULL COMMENT '院校扩展数据',
`is_active` BIT(1) NOT NULL DEFAULT b'1' COMMENT '是否启用',
`sort_order` INT NOT NULL DEFAULT 0 COMMENT '显示排序值',
`creator` VARCHAR(64) DEFAULT '' COMMENT '创建者',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` VARCHAR(64) DEFAULT '' COMMENT '更新者',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`),
KEY `idx_tenant` (`tenant_id`),
KEY `idx_tenant_region` (`tenant_id`, `region_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='教育-院校';
-- =============================================
-- 3. 专业表
-- =============================================
CREATE TABLE `education_major` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
`tenant_id` BIGINT NOT NULL COMMENT '租户编号',
`legacy_id` VARCHAR(64) DEFAULT NULL COMMENT '旧系统专业 ID',
`region_id` BIGINT DEFAULT NULL COMMENT '地区 ID',
`school_id` BIGINT DEFAULT NULL COMMENT '院校 ID',
`name` VARCHAR(200) NOT NULL COMMENT '专业名称',
`description` VARCHAR(500) DEFAULT NULL COMMENT '专业说明',
`study_tips` VARCHAR(500) DEFAULT NULL COMMENT '学习建议',
`is_active` BIT(1) NOT NULL DEFAULT b'1' COMMENT '是否启用',
`sort_order` INT NOT NULL DEFAULT 0 COMMENT '显示排序值',
`creator` VARCHAR(64) DEFAULT '' COMMENT '创建者',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` VARCHAR(64) DEFAULT '' COMMENT '更新者',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`),
KEY `idx_tenant` (`tenant_id`),
KEY `idx_tenant_school` (`tenant_id`, `school_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='教育-专业';
-- =============================================
-- 4. 科目表
-- =============================================
CREATE TABLE `education_subject` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
`tenant_id` BIGINT NOT NULL COMMENT '租户编号',
`region_id` BIGINT DEFAULT NULL COMMENT '地区 ID',
`school_id` BIGINT DEFAULT NULL COMMENT '院校 ID',
`major_id` BIGINT DEFAULT NULL COMMENT '专业 ID',
`module_id` BIGINT DEFAULT NULL COMMENT '地区模块 ID',
`name` VARCHAR(200) NOT NULL COMMENT '科目名称',
`type` VARCHAR(50) DEFAULT NULL COMMENT '科目类型',
`is_active` BIT(1) NOT NULL DEFAULT b'1' COMMENT '是否启用',
`sort_order` INT NOT NULL DEFAULT 0 COMMENT '显示排序值',
`creator` VARCHAR(64) DEFAULT '' COMMENT '创建者',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` VARCHAR(64) DEFAULT '' COMMENT '更新者',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`),
KEY `idx_tenant` (`tenant_id`),
KEY `idx_tenant_major` (`tenant_id`, `major_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='教育-科目';
-- =============================================
-- 5. 题目分类表
-- =============================================
CREATE TABLE `education_category` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
`tenant_id` BIGINT NOT NULL COMMENT '租户编号',
`subject_id` BIGINT DEFAULT NULL COMMENT '科目 ID',
`legacy_node_id` VARCHAR(64) DEFAULT NULL COMMENT '旧导航节点 ID',
`name` VARCHAR(200) NOT NULL COMMENT '分类名称',
`is_active` BIT(1) NOT NULL DEFAULT b'1' COMMENT '是否启用',
`sort_order` INT NOT NULL DEFAULT 0 COMMENT '显示排序值',
`creator` VARCHAR(64) DEFAULT '' COMMENT '创建者',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` VARCHAR(64) DEFAULT '' COMMENT '更新者',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`),
KEY `idx_tenant` (`tenant_id`),
KEY `idx_tenant_subject` (`tenant_id`, `subject_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='教育-题目分类';
-- =============================================
-- 6. 内容入口表
-- =============================================
-- Indexes:
-- uk_tenant_entry_key — per-tenant uniqueness for entry key
CREATE TABLE `education_content_entry` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
`tenant_id` BIGINT NOT NULL COMMENT '租户编号',
`legacy_id` VARCHAR(64) DEFAULT NULL COMMENT '旧系统内容入口 ID',
`region_id` BIGINT DEFAULT NULL COMMENT '地区 ID',
`entry_key` VARCHAR(100) NOT NULL COMMENT '内容入口唯一键',
`name` VARCHAR(200) NOT NULL COMMENT '内容入口名称',
`entry_type` VARCHAR(50) NOT NULL COMMENT '内容入口类型',
`icon` VARCHAR(500) DEFAULT NULL COMMENT '图标',
`route` VARCHAR(200) DEFAULT NULL COMMENT '前端路由',
`description` VARCHAR(500) DEFAULT NULL COMMENT '入口说明',
`visibility` VARCHAR(50) NOT NULL DEFAULT 'PUBLIC' COMMENT '可见性',
`access_rules` JSON DEFAULT NULL COMMENT '访问规则 JSON',
`layout_config` JSON DEFAULT NULL COMMENT '布局配置 JSON',
`is_active` BIT(1) NOT NULL DEFAULT b'1' COMMENT '是否启用',
`sort_order` INT NOT NULL DEFAULT 0 COMMENT '显示排序值',
`creator` VARCHAR(64) DEFAULT '' COMMENT '创建者',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` VARCHAR(64) DEFAULT '' COMMENT '更新者',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`),
KEY `idx_tenant` (`tenant_id`),
UNIQUE KEY `uk_tenant_entry_key` (`tenant_id`, `entry_key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='教育-内容入口';
-- =============================================
-- 7. 内容节点表(树形结构)
-- =============================================
-- Indexes:
-- idx_entry_parent — supports tree navigation: find children of a parent within an entry
-- idx_tenant_entry — tenant-scoped queries by entry
CREATE TABLE `education_content_node` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
`tenant_id` BIGINT NOT NULL COMMENT '租户编号',
`entry_id` BIGINT NOT NULL COMMENT '内容入口 ID',
`parent_id` BIGINT DEFAULT NULL COMMENT '父节点 IDNULL=根节点)',
`name` VARCHAR(200) NOT NULL COMMENT '节点名称',
`title` VARCHAR(200) DEFAULT NULL COMMENT '节点标题',
`node_type` VARCHAR(50) NOT NULL COMMENT '节点类型',
`marker_type` VARCHAR(50) DEFAULT NULL COMMENT '节点标记类型',
`depth` INT NOT NULL DEFAULT 0 COMMENT '树深度',
`is_leaf` BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否叶子节点',
`is_selectable` BIT(1) NOT NULL DEFAULT b'1' COMMENT '是否可被选择',
`is_active` BIT(1) NOT NULL DEFAULT b'1' COMMENT '是否启用',
`sort_order` INT NOT NULL DEFAULT 0 COMMENT '显示排序值',
`metadata` JSON DEFAULT NULL COMMENT '扩展元数据',
`creator` VARCHAR(64) DEFAULT '' COMMENT '创建者',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` VARCHAR(64) DEFAULT '' COMMENT '更新者',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`),
KEY `idx_tenant` (`tenant_id`),
KEY `idx_entry_parent` (`entry_id`, `parent_id`),
KEY `idx_tenant_entry` (`tenant_id`, `entry_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='教育-内容节点';
-- =============================================
-- 8. 题集表
-- =============================================
CREATE TABLE `education_question_collection` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
`tenant_id` BIGINT NOT NULL COMMENT '租户编号',
`entry_id` BIGINT DEFAULT NULL COMMENT '内容入口 ID',
`node_id` BIGINT DEFAULT NULL COMMENT '内容节点 ID',
`name` VARCHAR(200) NOT NULL COMMENT '题集名称',
`title` VARCHAR(200) DEFAULT NULL COMMENT '题集标题',
`collection_type` VARCHAR(50) NOT NULL COMMENT '题集类型',
`question_count` INT NOT NULL DEFAULT 0 COMMENT '题目数量',
`duration_minutes` INT DEFAULT NULL COMMENT '建议作答时长(分钟)',
`access_rules` JSON DEFAULT NULL COMMENT '访问规则 JSON',
`is_active` BIT(1) NOT NULL DEFAULT b'1' COMMENT '是否启用',
`sort_order` INT NOT NULL DEFAULT 0 COMMENT '显示排序值',
`metadata` JSON DEFAULT NULL COMMENT '扩展元数据',
`creator` VARCHAR(64) DEFAULT '' COMMENT '创建者',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` VARCHAR(64) DEFAULT '' COMMENT '更新者',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`),
KEY `idx_tenant` (`tenant_id`),
KEY `idx_tenant_entry` (`tenant_id`, `entry_id`),
KEY `idx_tenant_node` (`tenant_id`, `node_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='教育-题集';
-- =============================================
-- 9. 题目表(核心表)
-- =============================================
-- Indexes:
-- idx_tenant_published — 查询已发布题目(主查询路径)
-- idx_tenant_collection — 按题集筛选
-- idx_tenant_subject — 按科目筛选
-- idx_tenant_node — 按内容节点筛选
-- idx_tenant_type_diff — 按题型和难度筛选
-- Security note: correct_answer 和 explanation 列存在但需在 service 层过滤;
-- 学生端 DTO 绝不得包含这两列。
-- Options JSON: 存储 label, content, isCorrect, order — 完整选项数据。
-- Service 层在学生端返回前剥离 isCorrect。
CREATE TABLE `education_question` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
`tenant_id` BIGINT NOT NULL COMMENT '租户编号',
`content_version` INT NOT NULL DEFAULT 1 COMMENT '内容版本号(递增,保证历史报告稳定性)',
`stem` TEXT NOT NULL COMMENT '题干',
`type` VARCHAR(32) NOT NULL COMMENT '题型',
`type_label` VARCHAR(50) DEFAULT NULL COMMENT '题型显示名称',
`difficulty` VARCHAR(32) DEFAULT NULL COMMENT '难度',
`question_content` JSON DEFAULT NULL COMMENT '题干结构化内容(兼容复杂题型)',
`options` JSON NOT NULL COMMENT '选项 JSON [{label, content, isCorrect, order}]',
`correct_answer` VARCHAR(500) DEFAULT NULL COMMENT '正确答案(敏感字段,学生端不可返回)',
`explanation` TEXT DEFAULT NULL COMMENT '答案解析(敏感字段,学生端不可返回)',
`analysis` TEXT DEFAULT NULL COMMENT '深度解析(敏感字段)',
`status` VARCHAR(20) NOT NULL DEFAULT 'PUBLISHED' COMMENT '题目状态PUBLISHED-已发布, HIDDEN-已隐藏, DRAFT-草稿, INACTIVE-停用',
`is_published` BIT(1) NOT NULL DEFAULT b'1' COMMENT '是否已发布',
`collection_id` BIGINT DEFAULT NULL COMMENT '所属题集 ID',
`subject_id` BIGINT DEFAULT NULL COMMENT '所属科目 ID',
`node_id` BIGINT DEFAULT NULL COMMENT '所属内容节点 ID',
`tags` JSON DEFAULT NULL COMMENT '标签 JSON 数组',
`sort_order` INT NOT NULL DEFAULT 0 COMMENT '显示排序值',
`metadata` JSON DEFAULT NULL COMMENT '扩展元数据',
`creator` VARCHAR(64) DEFAULT '' COMMENT '创建者',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` VARCHAR(64) DEFAULT '' COMMENT '更新者',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`),
KEY `idx_tenant` (`tenant_id`),
KEY `idx_tenant_published` (`tenant_id`, `is_published`, `status`),
KEY `idx_tenant_collection` (`tenant_id`, `collection_id`),
KEY `idx_tenant_subject` (`tenant_id`, `subject_id`),
KEY `idx_tenant_node` (`tenant_id`, `node_id`),
KEY `idx_tenant_type_diff` (`tenant_id`, `type`, `difficulty`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='教育-题目';
-- =============================================
-- 10. 练习蓝图表
-- =============================================
CREATE TABLE `education_practice_blueprint` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
`tenant_id` BIGINT NOT NULL COMMENT '租户编号',
`mode` VARCHAR(50) NOT NULL COMMENT '练习模式',
`entry_id` BIGINT DEFAULT NULL COMMENT '内容入口 ID',
`node_id` BIGINT DEFAULT NULL COMMENT '内容节点 ID',
`collection_id` BIGINT DEFAULT NULL COMMENT '题集 ID',
`question_limit` INT DEFAULT NULL COMMENT '题目数量限制',
`duration_minutes` INT DEFAULT NULL COMMENT '建议作答时长(分钟)',
`eligible_count` INT NOT NULL DEFAULT 0 COMMENT '符合条件的题目数',
`total_count` INT NOT NULL DEFAULT 0 COMMENT '题库总数',
`available_types` JSON DEFAULT NULL COMMENT '可用题型列表 JSON',
`available_difficulties` JSON DEFAULT NULL COMMENT '可用难度列表 JSON',
`min_questions` INT NOT NULL DEFAULT 1 COMMENT '最少题目数',
`max_questions` INT NOT NULL DEFAULT 200 COMMENT '最多题目数',
`suggested_count` INT NOT NULL DEFAULT 20 COMMENT '建议题目数',
`creator` VARCHAR(64) DEFAULT '' COMMENT '创建者',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` VARCHAR(64) DEFAULT '' COMMENT '更新者',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`),
KEY `idx_tenant` (`tenant_id`),
KEY `idx_tenant_collection` (`tenant_id`, `collection_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='教育-练习蓝图';
-- =============================================
-- 11. 题集-题目关联表(多对多)
-- =============================================
CREATE TABLE `education_question_collection_question` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
`collection_id` BIGINT NOT NULL COMMENT '题集 ID',
`question_id` BIGINT NOT NULL COMMENT '题目 ID',
`sort_order` INT NOT NULL DEFAULT 0 COMMENT '排序值',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_collection_question` (`collection_id`, `question_id`),
KEY `idx_question` (`question_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='教育-题集题目关联';
-- =============================================
-- Post-migration verification queries
-- =============================================
-- Verify all tables exist:
-- SELECT TABLE_NAME FROM information_schema.tables
-- WHERE table_schema = DATABASE()
-- AND TABLE_NAME LIKE 'education_%'
-- ORDER BY TABLE_NAME;
-- Verify indexes (sample):
-- SHOW INDEX FROM education_question WHERE Key_name IN ('idx_tenant_published', 'idx_tenant_collection');
-- SHOW INDEX FROM education_content_node WHERE Key_name = 'idx_entry_parent';
-- Verify no orphan data (should be 0 after fresh migration for catalog tables):
-- SELECT 'region', COUNT(*) FROM education_region
-- UNION ALL SELECT 'school', COUNT(*) FROM education_school
-- UNION ALL SELECT 'major', COUNT(*) FROM education_major
-- UNION ALL SELECT 'subject', COUNT(*) FROM education_subject
-- UNION ALL SELECT 'category', COUNT(*) FROM education_category
-- UNION ALL SELECT 'content_entry', COUNT(*) FROM education_content_entry
-- UNION ALL SELECT 'content_node', COUNT(*) FROM education_content_node
-- UNION ALL SELECT 'question_collection', COUNT(*) FROM education_question_collection
-- UNION ALL SELECT 'question', COUNT(*) FROM education_question
-- UNION ALL SELECT 'practice_blueprint', COUNT(*) FROM education_practice_blueprint
-- UNION ALL SELECT 'collection_question', COUNT(*) FROM education_question_collection_question;