为了全面的满足企业业务上的分析需求,StarRocks当前设计了四种数据模型:明细模型、聚合模型、更新模型、主键模型。
1明细模型
明细模型是StarRocks中最常用的数据模型,顾名思义,它会保留所有的明细数据,也就是说,在明细模型下,即便导入两条完全相同的数据,StarRocks也会将数据原封不动的保存进表,不会进行聚合的操作,也没有update的语义。
基于明细模型的特点,我们不难发现,明细模型通常用于追加式的数据写入,比较适合:
1、需要保留原始数据的业务;
2、查询维度不固定的业务;
3、数据产生后就不会发生太多变化的业务。
还是举一个简单的例子,在starrocks库中创建明细模型表table02:
CREATE TABLE IF NOT EXISTS starrocks.table02 (
event_time DATETIME NOT NULL COMMENT "datetime of event",
event_type INT NOT NULL COMMENT "type of event",
user_id INT COMMENT "id of user",
channel INT COMMENT ""
)
DUPLICATE KEY(event_time, event_type,user_id)
DISTRIBUTED BY HASH(user_id) BUCKETS 10;
这里我们使用DUPLICATE KEY(event_time, event_type, user_id)显式的说明采用明细模型,并且指定排序键为event_time、event_type和user_id。排序键是指该表中数据存储时多重排序的次序,具体概念我们后面再讨论,这里先注意:
1、若在数据列中我们未定义聚合函数(例如2.1章table01的total列),则默认采用明细模型;
2、明细模型可以使用DUPLICATE KEY(列1,列2……)显式的说明使用明细模型,也可以整个省略;
3、若显式指定使用明细模型,则DUPLICATE KEY(列1,列2……)中,排序键“列1、列2……”需要是建表语句中的前几列,且顺序需要和建表语句中的保持一致(例如table02中的event_time, event_type和table01中的user_id, device_code,device_price,event_time),否则建表会报错;
4、在省略DUPLICATE KEY(列1,列2……)时,StarRocks通常也会默认为表选择前三列作为排序键。
所以,table02的建表语句也可以简写为:
CREATE TABLE IF NOT EXISTS starrocks.table02 (
event_time DATETIME NOT NULL COMMENT "datetime of event",
event_type INT NOT NULL COMMENT "type of event",
user_id INT COMMENT "id of user",
channel INT COMMENT ""
)
DISTRIBUTED BY HASH(user_id);
我们对table02导入几条数据: