データモデリングにJSONスキーマを使用しています。ベースDocument
スキーマを定義します。これは、後でモデルスキーマを定義するために使用します(例:Product
、Category
、User
など)。
これは、すべてのモデルに特定の構造/ルールを継承させたいためです。たとえば、すべてのモデルインスタンスには、特定の共通プロパティ(id
、createdAt
、updatedAt
など)が必要です。 OOP用語:Product extends Document
であるため、そのインスタンスプロパティを継承します。スキーマ用語では(私はそう思います)Document
は、モデルスキーマを作成するためのメタスキーマです。
Documentスキーマを次のように定義しました。
{
"$schema": "http://json-schema.org/draft-07/schema#",
"id": "http://example.com/schemas/document.json#",
"title": "Document",
"type": "object",
"additionalProperties": false,
"required": ["type", "name", "fields"],
"properties": {
"type": {
"constant": "document"
},
"name": {
"type": "string"
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"readOnly": {
"type": "boolean"
},
"properties": {
// common properties
// model-specific properties
}
}
}
$schema
、id
など)?properties
にいくつかの共通プロパティ(id
、createdAt
、...)が含まれていることを指定するにはどうすればよいですか。 ?NodeJを使用する場合、次のように ajv バリデーターを使用する小さなコードで単純なスキーマに対するこの制限を回避するのは簡単です:
function extendJsonSchema(baseSchema, extendingSchema) {
let extendedSchema = Object.assign({}, extendingSchema);
extendedSchema.properties = Object.assign(extendedSchema.properties, baseSchema.properties)
extendedSchema.required = extendedSchema.required.concat(baseSchema.required)
return extendedSchema
}
let baseSchema = require('./base.schema.json')
let extendingSchema = require('./extending.schema.json')
let extendedSchema = extendJsonSchema(baseSchema, extendingSchema)
const validate = ajv.compile(extendedSchema)
これにより、少なくとも私のユースケースが解決されます。