一、本质定位
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 字段(但tag number不能再复用) |
| 数组(字符串) | 长度 只能变大不能变小 | 无需指定长度,不存在变更需求 |
四、特殊功能支持
| 功能 | TDR 表 | PB 表 |
|---|---|---|
| 本地 TopN 索引(排行榜) | 支持 | 不支持 |
| 分布式索引(全局索引) | 支持 | 支持 |
| map 类型 | 不支持 | 原生支持 map |
| 默认值 | 默认为""或0; 可通过 defaultvalue 显式设置; |
默认为""或0; proto3 不支持显式设置;proto2 支持显式设置; |
| 部分字段查询 | 支持(一级字段) | 支持(包括嵌套多级字段) |
| 条件过滤 | 支持(包括嵌套多级字段) | 支持(包括嵌套多级字段) |
| 条件更新 | 仅支持对一级数组字段的PUSH/SET/POP操作 | 支持对数组成员(包括map成员)或者多级嵌套字段部分更新 |
| 记录过期淘汰 TTL | 支持 | 支持 |
| 乐观锁 | 支持 | 支持 |
| SDK | C++、Java、Go | C++、Go |
| RESTful API | 不支持 | 支持 |
Tcaplus没有空值(NULL), 未赋值的字段均使用默认值