TDR表和PB表主要功能差异

一、本质定位

Tcaplus支持用ProtoBuf或Tdr来定义表结构; 最主要的差异是SDK的ORM接口是Tdr还是Protobuf的对象。 功能上两者相差不是很大。 tdr表变更需要严格维护好字段和整个表version属性,以实现高版本表结构兼容低版本; pb表通过protobuf的默认tlv机制实现高低版本兼容。

二、数据类型差异

维度TDR 表PB 表
基础类型char, int8/int16/int32/int64, float, double、date、time、datetime标准 PB 类型:int32/64、uint32/64、sint32/64、fixed32/64、float、double、bool、string、bytes
复合类型struct(嵌套结构体)+ union(联合体)message(嵌套消息)+ oneof + map + enum

三、表变更规则差异

维度TDR 表PB 表
Value 字段删除不允许有条件允许删除 optional 或 repeated 字段(历史 tag number 不能再复用)
数组(字符串)长度 只能变大不能变小无需指定长度,不存在变更需求

PB 表是否允许改表、存量二进制数据是否仍保留旧字段、新老业务版本能否同时写入,是三个不同问题。完整说明见《PB 表数据读写与版本兼容性》。

四、特殊功能支持

功能TDR 表PB 表
本地 TopN 索引(排行榜)支持不支持
分布式索引(全局索引)支持支持
map 类型不支持原生支持 map
默认值默认为""或0; 可通过 defaultvalue 显式设置;默认为""或0; proto3 不支持显式设置;proto2 支持显式设置;
部分字段查询普通 TDR 请求支持一级字段;Blob 内 PB 子字段可通过专用接口读取支持(包括嵌套多级字段)
条件过滤支持(包括嵌套多级字段)支持(包括嵌套多级字段)
条件更新仅支持对一级数组字段的PUSH/SET/POP操作支持对数组成员(包括map成员)或者多级嵌套字段部分更新
记录过期淘汰 TTL支持支持
乐观锁支持支持
SDKC++、Java、GoC++、Go
RESTful API不支持支持

TDR Generic 表可以在 Blob 中保存 PB 数据,并按路径读写其中的标量、message、repeated 和 map;表类型仍为 TDR。接口、路径和限制见《TDR Blob 内嵌 Protobuf 部分字段读写》。

Tcaplus没有空值(NULL), 未赋值的字段均使用默认值