跳转至

索引与跨表引用

索引声明

需要表达唯一键或跨表关系时,可以在 GFConfigTableSchema.indexes 中加入 GFConfigTableIndexDefinition,在 references 中加入 GFConfigTableReference。唯一索引会参与单表校验;跨表引用由 GFConfigReferenceResolver.validate_tables() 在多表上下文中检查。

运行时查询

如果表数据保存为 GFConfigTableResourceschema.indexes 还可以作为运行时命名索引来源。调用 rebuild_indexes() 会把索引缓存写入 records_by_index,适合随 .tres/.res 一起保存;缓存为空时,get_index_record()get_index_records() 会按 schema 临时构建查询结果。

跨表引用

resolve_record_references() 可把一条记录的引用解析为目标记录副本。GF 只理解字段、复合键和报告结构,不解释外键背后的业务含义。

如果多张表已经聚合到 GFConfigDatabaseResource,可以直接调用 validate_database(),它会复用 GFConfigReferenceResolver.validate_tables() 检查整包 schema、表数据和跨表引用。

var unique_index := GFConfigTableIndexDefinition.new()
unique_index.index_id = &"item_variant"
unique_index.field_names = PackedStringArray(["item_id", "variant"])
unique_index.unique = true
item_schema.indexes.append(unique_index)

var reference := GFConfigTableReference.new()
reference.source_fields = PackedStringArray(["item_id"])
reference.target_table_name = &"items"
reference.target_fields = PackedStringArray(["id"])
owner_schema.references.append(reference)

var report := GFConfigReferenceResolver.validate_tables({
    &"items": item_rows,
    &"owners": owner_rows,
}, [item_schema, owner_schema])

var table := GFConfigTableResource.new()
table.table_name = &"items"
table.schema = item_schema
table.records = item_rows
table.rebuild_indexes()

var key := table.make_index_key(&"item_variant", {
    "item_id": 1001,
    "variant": "normal",
})
var item := table.get_index_record(&"item_variant", key)