【TcaplusDB知識庫】預設Schema表型別介紹

zmgogo發表於2021-11-23


TcaplusDB需要預設Schema,同時提供兩種表型別:Generic表和List表,Generic表一個Key(1-8個欄位)記錄對應一個Value記錄,List表一個Key(1-7個欄位)記錄對應多個Value記錄。List表根據是否進行排序分為普通list表和sortlist表,對於普通List表,Tcaplus內部是無序插入的,使用者取出一個Key下的所有Value時,Value內部是無序的。SortList表按照某個指定的Value欄位進行排序插入,使用者可以按照從大到小或者從小到大的順序進行取值。在PB和TDR表中都存在這三種schema模式,使用者可以根據需求選擇合適的模式。

1. 資料表及相關規則

1.1. 資料表規則

  • 資料表名稱不超過32位元組(包含'\0'結尾)

  • 欄位名不超過32位元組(包含'\0'結尾)

  • 每個Key欄位不超過1024位元組

  • 每個Value欄位不超過10MB

  • 單條記錄Pack後長度不超過10MB

1.2. 變更規則

  • 不允許對primarykey、splitkey、index做任何變更;

  • Value欄位可以增加欄位但不能減少欄位,並且增加欄位時要注意版本號的變更;

  • Value欄位預設值可更改,Value欄位最大長度只能改大不能改小;

  • 不允許刪除Value欄位,不允許更改Value欄位名稱和型別;

  • List型別表的最大元素個數只允許改大不允許改小,且最大元素個數不能超過10000;

1.3. Generic表

  • 可以建索引(見本地索引和全域性索引)

  • 最多支援8個Key欄位,256個Value欄位

1.4. List表

  • 不能建索引

  • Key欄位最多隻能有7個,Value欄位最多255個, 各有一個要預留給系統使用。

  • List支援方便的頭尾操作, 適合郵件,留言板,戰鬥記錄等場景

  • List表需要指定單個Key記錄下的最大元素個數(目前最大10000),超過最大元素個數時,可指定從頭部或尾部刪除老元素。預設採用FIFO方式淘汰。SortList表和普通List表一樣有最大元素個數,插入超過最大元素個數N時,對於正序(從小排到大)總是保留最小的N個元素,倒序則反之,總是保留最大的N個元素。

  • 可以一次取出單個Key下的所有Value,Value內部的排列無序。

2. Generic表

2.1. TDR-Generic表示例


<
struct 
name=
"PLAYERONLINECNT" 
version=
"1" 
primarykey=
"TimeStamp,GameSvrID" 
splittablekey=
"TimeStamp"
>

    < entry name= "TimeStamp"           type= "uint32"     desc= "單位為分鐘" />
    < entry name= "GameSvrID"         type= "string"     size= "64" />
    < entry name= "GameAppID"         type= "string"     size= "64" desc= "gameapp id" />
    < entry name= "OnlineCntIOS"       type= "uint32"     defaultvalue= "0" desc= "ios線上人數" />
    < entry name= "OnlineCntAndroid"   type= "uint32"     defaultvalue= "0" desc= "android線上人數" />
    < entry name= "BinaryLen"         type= "smalluint" defaultvalue= "1" desc= "資料來源資料長度;長度為0時,忽略來源檢查" />
    < entry name= "binary"             type= "tinyint"     desc= "二進位制" count= "1000" refer= "BinaryLen" />
    < entry name= "binary2"           type= "tinyint"     desc= "二進位制2" count= "1000" refer= "BinaryLen" />
    < entry name= "strstr"             type= "string"     size= "64" desc= "字串" />
    < index name= "index_id"   column= "TimeStamp" />
</ struct >

2.2. PB-Gneric表示例


message 
pb_generic_index_shardingkey {

    option( tcaplusservice. tcaplus_primary_key) = "openid,tconndid,timekey,svrid";
    option( tcaplusservice. tcaplus_index) = "index_openid(openid)";
    option( tcaplusservice. tcaplus_index) = "index_openid_tconndid(openid,tconndid)";
    option( tcaplusservice. tcaplus_index) = "index_full_key(openid,tconndid,timekey,svrid)";
   
    option( tcaplusservice. tcaplus_sharding_key) = "openid";

    //4個key
    required uint32 openid = 1; //QQ Uin
    required string timekey = 2[( tcaplusservice. tcaplus_size) = 20, ( tcaplusservice. tcaplus_desc) = "bingo"];
    required int32 tconndid = 3;
    required string svrid = 4;
   
    //value
    required string gamesvrid = 5[( tcaplusservice. tcaplus_size) = 11];
    repeated property other_property= 6 ; //其他擴充套件屬性
    optional item_bag items = 7;
    repeated int64 lockid = 8 [ packed = true];
    optional bytes val = 9;
    optional pay_info pay = 10;
    optional uint32 id_uint32 = 11;
    optional int32 id_int32 = 12;  
}

3. List表

Tcaplus對List表的儲存採用分級機制,包括:

  • 索引記錄,Fullkey + (idx1,idx2,idx3,……,idxn)

  • 資料記錄,[FullKey+idx1,value1] [ FullKey+idx2,value2] [ ……][FullKey+idxn,valuen]

3.1. TDR-List表示例


<
struct 
name=
"following_action_list" 
version=
"1" 
primarykey=
"game,myuin"
>

    < entry name= "game"           type= "uint64"   defaultvalue= "0"     desc= "遊戲ID" />
    < entry name= "myuin"           type= "uint32"                       desc= "QQ號" />
    < entry name= "actiontype" type= "uint8"     defaultvalue= "0"     desc= "1-分享圖片,2-贊圖片,3-評論圖片" />
    < entry name= "uin2"           type= "uint32"                       desc= "關注人QQ號" />
    < entry name= "nick2"           type= "string"   size= "128"           desc= "關注人暱稱" />
    < entry name= "sex"             type= "uint8"     defaultvalue= "0"     desc= "關注人性別男0女1" />
    < entry name= "pid"             type= "string"   size= "33"           desc= "關注人操作圖片ID" />
    < entry name= "time"           type= "uint32"                       desc= "時間" />
    < entry name= "content"         type= "string"   size= "1024"         desc= "動態詳細內容" />
</ struct >

3.2. PB-List表示例


syntax = 
"proto3";


package myTcaplusTable;

import "tcaplusservice.optionv1.proto";

message tb_online_list {
    option( tcaplusservice. tcaplus_primary_key) = "openid,tconndid,timekey";
    option( tcaplusservice. tcaplus_customattr) = "TableType=LIST;ListNum=1900";

    int32 openid = 1; //QQ Uin
    int32 tconndid = 2;
    string timekey = 3;
    string gamesvrid = 4;
    int32 logintime = 5 ;
    repeated int64 lockid = 6;
    pay_info pay = 7;

    message pay_info {
        uint64 total_money = 1;
        uint64 pay_times = 2;
   }
    map< string, pay_info> projects = 8;
}

4. SortList表

最多允許4個排序欄位,且在建表的xml(tdr)中指定,具體格式如下:


<
struct 
name=
"following_action_list" 
version=
"1" 
primarykey=
"game,myuin" 
customattr=
"TableType=SORTLIST;SortRule=INSC;SortFieldNum=1"
>

    < entry name= "game"           type= "uint64"   defaultvalue= "0"     desc= "遊戲ID" />
    < entry name= "myuin"           type= "uint32"                       desc= "QQ號" />
    < entry name= "actiontype" type= "uint8"     defaultvalue= "0"     desc= "1-分享圖片,2-贊圖片,3-評論圖片" />
    < entry name= "uin2"           type= "uint32"                       desc= "關注人QQ號" />
    < entry name= "nick2"           type= "string"   size= "128"           desc= "關注人暱稱" />
    < entry name= "sex"             type= "uint8"     defaultvalue= "0"     desc= "關注人性別男0女1" />
    < entry name= "pid"             type= "string"   size= "33"           desc= "關注人操作圖片ID" />
    < entry name= "time"           type= "uint32"   customattr= "sort1"   desc= "時間" />
    < entry name= "content"         type= "string"   size= "1024"         desc= "動態詳細內容" />
</ struct >

如上customattr="TableType=SORTLIST;ListNum=1023;SortFieldNum=1"表示該表格型別為SORTLIST,SortRule=INSC表示升序排列,SortFieldNum=1表示排序欄位有1個,customattr="sort1"表示第一個排序欄位。

  • 排序預設按照從小到大進行排序,在ServiceApi中可以指定是從小到大取還是從大到小取。

  • 暫時不允許在表變更時從無序List變為SortList,也不允許從SortList變更為無序List,不允許表變更變換排序欄位的順序以及增減排序欄位(這個均採用自己寫so走表變更Key-Value方式實現)。

  • 排序欄位最大位元組數8B,排序欄位的型別:byte, uint16,uint32,uint64,int16,int32,int64,float,double【string(包含\0最多8B,暫時不支援)】。

  • 排序是指Value欄位參與排序,而不是Key。

使用說明:

排序

當已有資料結構排好序後,再採用ListAddAfter進行資料插入時,採用插入排序效果最佳。

插入

對於ListAddAfter,流程是:先看是否已經滿了,如果滿了且不允許淘汰元素,則插入失敗,如果滿了,允許淘汰,則刪掉那個元素,並且獲取一個BiggestIndex,將新元素插在對應位置,並挪動其他元素。

而對於SortList,當使用者進行ListAddAfter時,List數目超過最大元素個數N時,對於正序(從小排到大)總是保留最小的N個元素,也就是說插入的元素比當前最大值還大時,會插入失敗(因為立即被淘汰),而倒序則反之,總是保留最大的N個元素。

4.1. TDR-Sortlist表示例


<
struct 
name=
"table_Sortlist_single" 
primarykey=
"key, name" 
customattr2=
"TableType=SORTLIST;ListNum=1023;SortFieldNum=1;SortRule=DESC" 
version=
"5" 
desc=
"用於list表遍歷測試, 需要4個shard, 建表list最大1023個元素" 
>

        < entry name= "key"       type= "uint32"   desc= "單個uint32作為KEY的時候, hashcode = key % 10000" />
        < entry name= "name"     type= "int16" />
        < entry name= "level"       type= "uint32" />
        < entry name= "value1"   type= "string"   size= "102400" defaultvalue= "" desc= "最大長度:100KB" />
        < entry name= "value2"   type= "string"   size= "102400" defaultvalue= "" desc= "最大長度:100KB" />
        < entry name= "type_int8" type= "int8" desc= "type_int8" />
        < entry name= "type_uint8" type= "uint8" desc= "type_uint8" />
        < entry name= "type_int16" type= "int16" desc= "type_int16" customattr2= "sort1" />
        < entry name= "type_uint16" type= "uint16" desc= "type_uint16" />
        < entry name= "type_int32" type= "int32" desc= "type_int32" />
        < entry name= "type_uint32" type= "uint32" desc= "type_uint32" />
        < entry name= "type_int64" type= "int64" desc= "type_int64" />
        < entry name= "type_uint64" type= "uint64" desc= "type_uint64" />
        < entry name= "type_float" type= "float" desc= "type_float" />
        < entry name= "type_double" type= "double" desc= "type_double" />
        < entry name= "type_short" type= "short" desc= "type_short" />
        < entry name= "type_string" type= "string" desc= "type_string" size= "20" />
        < entry name= "type_tinyint" type= "tinyint" desc= "type_tinyint" />
        < entry name= "type_datetime" type= "datetime" desc= "type_datetime" />
</ struct >

4.2. PB-SortList表示例


message 
pb_sortedlist {

    option( tcaplusservice. tcaplus_primary_key) = "openid,tconndid,timekey,svrid";  
    option( tcaplusservice. tcaplus_customattr) = "TableType=SORTLIST;ListNum=1900;SortField=id_int32";
   
    //4個key
    required uint32 openid = 1; //QQ Uin
    required string timekey = 2[( tcaplusservice. tcaplus_size) = 20, ( tcaplusservice. tcaplus_desc) = "bingo"];
    required int32 tconndid = 3;
    required string svrid = 4;
   
    //value
    required string gamesvrid = 5[( tcaplusservice. tcaplus_size) = 11];
    repeated property other_property= 6 ; //其他擴充套件屬性
    optional item_bag items = 7;
    repeated int64 lockid = 8 [ packed = true];
    optional bytes val = 9;
    optional pay_info pay = 10;
    optional uint32 id_uint32 = 11;
    optional int32 id_int32 = 12;  
}

img

TcaplusDB是騰訊出品的分散式NoSQL資料庫,儲存和排程的程式碼完全自研。具備快取+落地融合架構、PB級儲存、毫秒級時延、無損水平擴充套件和複雜資料結構等特性。同時具備豐富的生態、便捷的遷移、極低的運維成本和五個九高可用等特點。客戶覆蓋遊戲、網際網路、政務、金融、製造和物聯網等領域。



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69982264/viewspace-2843732/,如需轉載,請註明出處,否則將追究法律責任。

相關文章