TencentDB for TcaplusDB supports two table definition languages: Protocol Buffers (Protobuf) and Tencent Data Representation (TDR).
Protobuf is a method of serializing structured data developed by Google, which emphasizes simplicity and performance.
TDR is a platform-neutral data description language developed by Tencent, which combines the advantages of XML, binary language, and object-relational mapping (ORM) and is widely used in data serialization scenarios of Tencent's games.
Both languages are equally useful. Use either of them based on your usage habits.
This document describes how to define tables in TDR.
TDR supports GENERIC tables and LIST tables. GENERIC tables represent the attributes of elements in the form of tables, such as students, employers, and game players. LIST tables are a list of records, such as game leaderboards and in-game emails (usually the last 100 emails).
You can create different types of tables in one XML file.
metalib
element is the root element of XML files.tagsetversion
attribute must be one.struct
element with the primarykey
attribute needs to be defined as a table, or else it is just a structure.primarykey
attribute is used to specify the primary key field. A GENERIC table supports up to four primary key fields and a LIST table supports up to three.splittablekey
attribute works as a shardkey to shard a TcaplusDB table into multiple shards and store them on multiple nodes. splittablekey
must be one of the primary key fields. As a highly discrete splittablekey
has better performance and a wide value range, we recommend a STRING splittablekey
.desc
attribute describes the element.entry
element defines a field. Valid values: int32, string, char, int64, double, short.index
element defines an index which must contain splittablekey
. Since the primary key can be used to query tables, the index should have a different attribute from the primary key.<?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>
Additionally, you can use union
to create nested type data.
The union
element defines a simple type as a collection (union) of values from specified simple data types, such as INT and STRING. You can use union
as a custom data type.
The Macro
tag is used to define constants.
<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>
Was this page helpful?