
Substance.Data Schema完全指南类型定义、属性继承与数据校验【免费下载链接】dataA uniform interface for domain data (deprecated)项目地址: https://gitcode.com/gh_mirrors/data26/dataSubstance.Data Schema 是 Substance.Data 框架一款基于图的 JavaScript 领域数据表示库现已停止维护但思路极具学习价值中定义数据结构、约束数据类型的核心机制。本文面向新手用最通俗的方式带你掌握 Schema 的类型定义、属性继承与数据校验三大核心能力并理解它与 Graph 图模型如何配合快速上手构建规范化的领域数据。⚠️ 小提示该项目已标记为 deprecated弃用官方建议改用 Substance 主项目。但它的 Schema 设计思想非常清晰是理解图数据 类型系统的最佳入门教材。什么是 Substance.Data Schema简单说Schema 就是一份数据说明书。它声明了你的领域里有哪几种数据类型如文章、评论、每种类型有哪些属性如标题、作者、每个属性是什么值类型字符串、数字、布尔值等。在 Substance.Data 中一份 Schema 通常包含三个关键字段字段作用示例id模式唯一标识schema-1version模式版本号1.0.0types所有类型的集合{ elem: {...}, node: {...} }Schema 的实现位于 src/schema.js对外暴露了defaultValue()、parseValue()、typeChain()、properties()等一套完整的模式检查 APISchema Inspection API。类型定义入门六种基础值类型Substance.Data 内置了6 种基础值类型覆盖绝大多数业务场景string字符串number数字boolean布尔值object对象array数组date日期定义一个类型的语法非常直观每个类型就是一个对象properties字段列出该类型拥有的全部属性及其值类型。var SCHEMA { id: schema-1, version: 1.0.0, types: { elem: { properties: { name: string, count: number, flag: boolean, meta: object, tags: array, time: date } } } };这套类型清单定义在 src/graph.js 的VALUE_TYPES常量中是数据校验的基础。值得一提的是每种类型都有合理的默认值由Schema.defaultValue()统一提供值类型默认值object{}array[]stringnumber0booleanfalsedate当前时间属性继承机制详解让类型复用更优雅Schema 最有魅力的设计就是属性继承。你可以在一个类型上声明parent字段指向父类型子类型会自动继承父类型的所有属性。types: { node: { properties: { name: string } }, numbers: { parent: node, // 继承 node properties: { val: number } } }此时numbers类型同时拥有val和从node继承来的name属性。框架通过两条 API 支撑继承体系typeChain(typeId)返回类型链例如[node, numbers]父类型永远排在前面properties(type)递归合并父类型的属性返回该类型可用的完整属性集合测试用例见 tests/schema_test.js。借助类型链你还能调用isInstanceOf(type, parentType)判断某个类型是否属于某父类体系或通过baseType(typeId)找到最顶层的基类。这套机制让复杂领域模型的组织变得像类继承一样自然。数据校验与类型转换parseValue 如何保证数据安全Schema 的第二大职责是数据校验与转换核心入口是parseValue(valueType, value)。它做了三件事类型校验值不符合声明类型时直接抛错例如给number传入字符串、给array传入对象自动转换字符串形态的输入会被解析成对应类型比如42→42、true→true、JSON 字符串 → 对象/数组、ISO 日期字符串 →Date深拷贝保护object和array类型会调用util.deepclone深拷贝防止外部修改污染图数据。在实际使用中当你通过graph.set(path, value)修改节点属性时框架会自动调用parseValue按 Schema 校验并转换确保写入图的数据始终符合类型约定。这是数据校验最常见的落地场景相关逻辑见 src/property.js 的set方法。复合类型数组与对象的进阶用法除了单一值类型Schema 还支持复合类型——用数组形式表达容器 元素类型。properties: { scores: [array, number], // 数字数组 matrix: [array, array, number] // 二维数字数组 }规则是数组的第一个元素表示容器类型array或object后面的元素表示内部元素类型可以层层嵌套。对应的 API 是propertyType(type, property)返回完整类型如[array, number]propertyBaseType(type, property)返回最外层基础类型如array。复合类型常用于表示一对多关系配合 Graph 的query()方法还能把数组中的 ID 引用自动解析为真实的节点对象实现智能查询。在 Graph 中使用 Schema完整实践流程理解了 Schema 之后把它接入 Graph 图模型只需一步——实例化时传入var Data require(substance-data); var graph new Data.Graph(SCHEMA); // 创建符合 Schema 的节点 graph.create({ id: fruit_1, type: numbers, name: 苹果, val: 5 }); // 修改属性时自动校验与转换 graph.set([fruit_1, val], 10); // 10 自动转为数字 10值得注意的细节图数据会记录schema标识id version加载 seed 数据时若 Schema 不匹配会抛出GraphError防止旧数据配新 Schema的隐患全局 API 入口在 index.jsGraph、Schema、Property、Index四大模块分工明确分别是图操作、模式定义、属性解析与索引查询完整的 Schema 测试用例可参考 tests/schema_test.js涵盖默认值、类型转换、继承、复合类型四大场景是理解行为的捷径。总结Schema 的三个核心价值回顾全文Substance.Data Schema 的价值可以浓缩为三点类型定义6 种基础值类型 复合类型用声明式语法描述领域模型属性继承parent机制 类型链 API让类型复用、层级管理变得轻松数据校验parseValue与defaultValue双保险保证图内数据始终合法、可控。虽然项目已停止维护但这份轻量级图数据 Schema的设计至今仍有很强的参考意义。希望这份指南能帮你快速理解它的类型定义、属性继承与数据校验机制在阅读源码或设计自己的数据模型时有所启发。【免费下载链接】dataA uniform interface for domain data (deprecated)项目地址: https://gitcode.com/gh_mirrors/data26/data创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考