mcpField
R
relational-data-modeling

relational-data-modeling

github.com/pproenca数据与数据库21869 次安装11 周前更新
代码仓库

关于 relational-data-modeling

relational-data-modeling 是用于设计和审查关系型数据库模式的技能,示例基于 PostgreSQL 18。它聚焦键、关系、类型和约束的选择,让数据库能够执行数据规则。

主要功能

  1. 01覆盖六类模式设计指导
  2. 02实体标识与键设计
  3. 03关系和基数建模
  4. 04约束与类型选择
  5. 05历史记录和生命周期建模

适用场景

  1. 01设计实体关系模型
  2. 02审查表定义或迁移
  3. 03在数据库中落实数据规则
  4. 04评估 ORM 生成的模式

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/pproenca/dot-skills --skill relational-data-modeling

安装后在 Claude Code 中输入/relational-data-modeling确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

AGENTS.md
metadata.json
assets/templates/
_template.md
references/
_sections.md
cons-check-is-single-row.md
cons-deferrable-for-cycles.md
cons-exclude-for-non-overlap.md
cons-not-null-by-default.md
cons-not-valid-then-validate.md
cons-partial-unique-index.md
key-identity-not-serial.md
key-partition-axis-binds-the-key.md
key-primary-key-is-real-identity.md
key-propagate-scoping-key.md
key-uuidv7-for-client-generated.md
norm-derived-needs-a-mechanism.md
norm-encoded-composite-values.md
norm-jsonb-for-open-shapes.md
rel-choose-referential-action.md
rel-index-referencing-side.md
rel-no-polymorphic-fk.md
rel-one-to-one-is-one-table.md
rel-relationship-as-entity.md
rel-subtypes-through-the-key.md
time-events-not-in-place-updates.md
time-soft-delete-breaks-constraints.md
time-valid-vs-transaction-time.md
time-validity-as-a-range.md
type-enum-lookup-or-check.md
type-numeric-with-currency.md

详细介绍

关系数据建模

关系模式所迫使你做出的决策,以及如何妥善处理,让数据库尽可能执行约束,应用只负责必须由它处理的部分。每条规则都会指出它要纠正的错误默认做法;对于有能力的模型本就能正确处理的情况,不会专门立规。

示例使用 PostgreSQL 18,本技能中的每条 DDL 语句均已在 18.4 上执行,包括失败示例,以确认约束确实会拒绝声称要拒绝的内容。大约三分之一的规则依赖 MySQL 和 SQLite 不具备的机制(EXCLUDE、部分唯一索引、范围类型、WITHOUT OVERLAPS、可延迟约束、NOT VALID);这些规则会对此作出说明。判断类规则适用于任何关系型引擎。

适用场景

在以下情况下使用本技能:

  • 编写或审查 CREATE TABLE / ALTER TABLE、迁移,或 ORM 模式定义(Prisma、Drizzle、Django models、ActiveRecord、Ecto、SQLAlchemy)
  • 设计实体关系模型,或为某一行命名——这是键的选择一旦确定就难以更改的阶段
  • 用户询问“应该用一张表还是两张表”“多对多关系该如何建模”“模式允许了错误数据”“我们需要历史记录”“我们要添加多租户支持”或“数据库能否强制执行这项约束”
  • 某个 Bug 最终被发现是模式允许了错误状态——例如唯一约束本应阻止的重复数据、外键本应阻止的孤儿记录、重叠的预订,或两行都被标记为默认项
  • 为已有数据和流量的表添加约束
  • 审查由 ORM 或脚手架工具生成的模式,因为多态关联、自反式代理键和一刀切的软删除标记往往由此而来

本技能不适用于:

  • 查询调优、执行计划,或为读取路径选择索引——本技能只涵盖约束和外键所需的索引
  • 连接池、复制或运维调优
  • 非关系型存储,因为本技能所依据的权衡不适用于这类存储

规则类别

#类别前缀涵盖内容
1标识与键key-一行代表什么;每个外键都依赖的选择
2关系与基数rel-确保数据库能够声明引用,而不只是表达意图
3以约束作为模型cons-哪种机制能够真正维护哪种不变量
4类型与域type-可用成本最低的约束;按含义而非习惯选择
5派生与编码数据norm-每次有意复制数据所付出的代价,以及数据库无法查看其内部的内容
6时间、历史与生命周期time-世界发生变化时,一行会如何变化

快速参考

1. 标识与键
2. 关系与基数
3. 将约束作为模型的一部分
4. 类型与域
5. 派生数据与编码数据
6. 时间、历史与生命周期

使用方法

当某项决策出现时,阅读对应的参考文件——上面的快速参考足以帮助你找到方向。每条规则都会说明它要纠正的错误默认做法及其原因,然后给出一个规范示例。

有两条经验法则贯穿各类别,即使不针对某条具体规则,也值得遵循:

  1. 添加列之前,先说清楚什么条件会让两行被视为同一行。 这句话是你对这张表应承担的一项约束。
  2. 在应用代码中编写验证之前,先问问能否用某项约束替代它。 如果答案是“不能”,那么明确这一点也很有价值——请参阅 cons-check-is-single-row,了解不变量形态与机制的对应关系。

参考文件

文件描述
references/_sections.md类别定义与排序
assets/templates/_template.md新规则模板
metadata.json版本与来源参考

评论

支持 Markdown