master新特性讨论-字符串类型VID超长后自动截取特性

https://docs.nebula-graph.com.cn/master/3.ngql-guide/3.data-types/3.string/
https://docs.nebula-graph.com.cn/2.0.1/3.ngql-guide/3.data-types/3.string/
对比2.0.1版本的文档发现一个有趣的新特性描述

在写入定长字符串时,如果尝试写入的字符串超出长度限制,Nebula Graph将截断字符串,仅存入符合长度限制的部分。例如,当一个图空间的VID类型为FIXED_STRING(8)时,如果尝试将A_string_with_27_characters设置为VID,然后使用nGQL命令查询该VID,获取到的只有A_string。

根据测试发现现在如果长度超过了会报错,而不是master文档中描述的直接截取。希望和大家讨论一下这个新特性的优点和缺点

创建图空间
CREATE SPACE space0815(partition_num=15, replica_factor=3, vid_type=fixed_string(30))

创建schema
create tag player(name string,age int);


(root@nebula) [space0815]> INSERT VERTEX player(name, age) VALUES '1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqs':('Tim Duncan', 42);
[ERROR (-8)]: Storage Error: The VID must be a 64-bit interger or a string fitting space vertex id length limit.
Tue, 17 Aug 2021 14:16:16 CST

(root@nebula) [space0815]> INSERT VERTEX player(name, age) VALUES '1qqqqqqqqqqqqqqqqqqqqqqqqqqqq':('Tim Duncan', 42);
Execution succeeded (time spent 2075/2499 us)

首先,我认为2.0.1版本的做法很好理解,和mysql,oracle等关系型数据的设计也是一样的。超长就报错。
其次,master的新特性自动截取的功能,优点可能是“更方便写入数据”,
缺点,1.VID截取后冲突时默认覆盖,2.如果再业务系统中记录的时VID,然后在写入时被截取了,那么业务系统不会知道这件事,也无法再查询到这条数据了。

如果真的要加这个特性,建议在配置文件里添加要给配置项,允许用户决定是否启用

您好!您的建议还是不错的,因为对于用户来说,有的希望长度超了截断,有的希望长度超了报错,而且这两类客户都可能存在,解决的方案就是增加配置项,这个配置项可以配置截断或者报错,当然默认值应该是截断,以保持和原来行为兼容,我们在下个版本会增加这个配置项,让大家根据自己的需要设置。

但是2.0.1就是直接报错,不是截断啊,如果要和之前的兼容,应该是直接报报错才对。
而且,最近思考这个问题,结果就是截断回引发很多二次问题,比如覆盖历史数据,多次写入只又最后一条保留。这种覆盖也是由于nebula的新增特性引起的。相同主键直接覆盖这个特性太强大了,如果nebula可以保证vid的唯一性那么超长截断是没有问题的,反之,如果不能保证,还要截断,那么后面围绕这个可截断特性会要做很多事情来“填坑”。可以深度发掘用户的需求,我更觉得他们是想要nebula可以保证vid的唯一且在重复时报错,类似mysql的主键或者唯一键重复。仅仅是我个人的看法。。

或者这样说,nebula支持超长截取,但是相同的VID会直接覆盖,没有任何提示。如果这样和用户沟通,估计他不会喜欢超长截取这个特性。或者您知道这种特性在哪些场景下需要,有具体的场景会更有说服力!

1 个赞

不好意思,我确认过了。首先文档确实描述的有问题,准确的描述是:当VID如果是固定长度字符串时,插入超长的会报错。而当属性是固定长度字符串,长度超了会自动截断。文档会尽快修改,目前关于VID超长后如何处理这个标志位暂时不会增加,是我的理解有问题。

1 个赞

哈哈哈哈,无意间发现了一个文档的bug。

该话题在最后一个回复创建后7天后自动关闭。不再允许新的回复。

浙ICP备20010487号