数据库以表为载体存储数据,不同的表往往表示不同的实体。作为国产自研键值型nosql数据库,TcaplusDB支持2种类型的表:protobuf(Protocol Buffers)表和TDR(Tencent Data Representation)表。
Protobuf是Google开发的一种描述性语言,对结构化数据进行序列化,同时强调简单性和性能; TDR是由腾讯开发的跨平台数据表示语言,结合了XML,二进制和ORM(对象关系映射)的优势,在腾讯游戏数据的序列化场景中广泛使用。本文将简单介绍如何定义这两种表。
以下是protobuf表game_players.proto
的示例,您可以将文件上传到腾讯云控制台并创建该表。
syntax = "proto3"; // 指定protobuf语言版本,proto3. // 导入TcaplusDB公共定义服务 import "tcaplusservice.optionv1.proto"; message game_players { // 定义TcaplusDB表,包含message类型 // 基于选择项tcaplusservice.tcaplus_primary_key创建主键字段 // TcaplusDB单个表最多能指定4个主键字段 option(tcaplusservice.tcaplus_primary_key) = "player_id, player_name, player_email"; // 基于选择项tcaplusservice.tcaplus_index创建主键索引 option(tcaplusservice.tcaplus_index) = "index_1(player_id, player_name)"; option(tcaplusservice.tcaplus_index) = "index_2(player_id, player_email)"; // TcaplusDB支持的数值类型: // int32, int64, uint32, uint64, sint32, sint64, bool, fixed64, sfixed64, double, fixed32, sfixed32, float, string, bytes // 嵌套类型: message // 主键字段 int64 player_id = 1; string player_name = 2; string player_email = 3; // 普通(非主键) 字段 int32 game_server_id = 4; repeated string login_timestamp = 5; repeated string logout_timestamp = 6; bool is_online = 7; payment pay = 8; } message payment { int64 pay_id = 1; uint64 amount = 2; int64 method = 3; }
TDR支持通用(generic
)表和列表(list
)表。 generic表是以表的形式表示元素属性的表,例如学生,雇主,游戏玩家表。 list表是一系列记录,例如游戏排行榜,游戏中的邮件(通常是最近的100封邮件)。
推荐在一个XML文件中创建两种不同类型的表。
users_mails.xml
<?xml version="1.0" encoding="utf-8" standalone="yes" ?> <metalib name="tcaplus_tb" tagsetversion="1" version="1"> <!-- generic_table `users`, store the user' information --> <!-- an user may has many roles --> <struct name="users" version="1" primarykey="user_id,username,role_id" splittablekey="user_id" desc="user table"> <entry name="user_id" type="uint64" desc="user id"/> <entry name="username" type="string" size="64" desc="login username"/> <entry name="role_id" type="int32" desc="a user can have multiple roles"/> <entry name="level" type="int32" defaultvalue="1" desc="role's level"/> <entry name="role_name" type="string" size="1024" desc="role's name"/> <entry name="last_login_time" type="string" size="64" defaultvalue="" desc="user login timestamp"/> <entry name="last_logout_time" type="string" size="64" defaultvalue="" desc="user logout timestamp"/> <index name="index1" column="user_id"/> </struct> <!-- list_table `mails`, store the role's mails --> <struct name="mails" version="1" primarykey="user_id,role_id" desc="mail table"> <entry name="user_id" type="uint64" desc="user id"/> <entry name="role_id" type="int32" desc="a user may has many roles"/> <entry name="text" type="string" size="2048" desc="mail text"/> <entry name="send_time" type="string" size="64" defaultvalue="" desc="timestamp of the mail sent"/> <entry name="read_time" type="string" size="64" defaultvalue="" desc="timestamp of the mall read"/> </struct> </metalib>
<macro name="DB_MAX_USER_MSG_LEN" value="301" desc="Max length of the message that user can define"/> <union name="DBPlayerMsg" version="1" desc="DB Player message"> <entry name="SysMsgID" type="uint8" desc="Message ID" /> <entry name="UsrMsg" type="string" size="DB_MAX_USER_MSG_LEN" desc="player created message" /> </union>
TcaplusDB是腾讯出品的分布式NoSQL数据库,存储和调度的代码完全自研。具备缓存+落地融合架构、PB级存储、毫秒级时延、无损水平扩展和复杂数据结构等特性。同时具备丰富的生态、便捷的迁移、极低的运维成本和五个九高可用等特点。客户覆盖游戏、互联网、政务、金融、制造和物联网等领域。