數據庫以表為載體存儲數據,不同的表往往表示不同的實體。作為國產自研鍵值型nosql數據庫,TcaplusDB支持2種類型的表:protobuf(Protocol Buffers)表和TDR(Tencent Data Representation)表。
Protobuf是Google開發的一種描述性語言,對結構化數據進行序列化,同時強調簡單性和性能; TDR是由騰訊開發的跨平台數據表示語言,結合了XML,二進制和ORM(對象關系映射)的優勢,在騰訊游戲數據的序列化場景中廣泛使用。本文將簡單介紹如何定義這兩種表。
Protobuf表
以下是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表
TDR支持通用(generic
)表和列表(list
)表。 generic表是以表的形式表示元素屬性的表,例如學生,雇主,游戲玩家表。 list表是一系列記錄,例如游戲排行榜,游戲中的郵件(通常是最近的100封郵件)。
推薦在一個XML文件中創建兩種不同類型的表。
- 元素metalib是xml文件的根元素。另外,您可以使用union創建嵌套類型:
- 包含屬性primarykey的struct元素定義一個表;否則,它只是一個普通的結構體。
- 每次修改表結構時,版本屬性值需要相應地加1,初始版本始終為1。
- primarykey屬性指定主鍵字段;對於generic表,您最多可以指定8個主鍵字段,對於list表,則可以指定7個。
- splittablekey屬性等效於分片鍵(shard key),TcaplusDB表被拆分存儲到多個存儲節點。 splittablekey必須是主鍵字段之一,一個好的splittablekey應該具有高度分散性,這意味着值的范圍很廣,建議選用字符串類型。
- desc屬性包含當前元素的描述。
- entry元素定義一個字段。支持的值類型包括int32,string,char,int64,double,short等。
- index元素定義一個索引,該索引必須包含splittablekey。由於可以使用主鍵查詢表,因此索引不應與主鍵屬性相同。 樣例:
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>
- union元素包含原始類型的集合,例如整數和字符串,可以將Union也可以作為自定義類型來引用;
- Macro標簽用於定義常量。
<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級存儲、毫秒級時延、無損水平擴展和復雜數據結構等特性。同時具備豐富的生態、便捷的遷移、極低的運維成本和五個九高可用等特點。客戶覆蓋游戲、互聯網、政務、金融、制造和物聯網等領域。