从数据建模的角度来看,数据序列化方法 (protobuff/thrift) vs Yang?
Data serialization methods (protobuff/thrift) vs Yang from data modeling standpoint?
protobuff 和 thrift 都提供了数据定义功能——thrift 结构和 protobuff 消息。除了序列化格式之外,它是否使它们成为数据建模语言?
或者我们使用例如数据建模的方式存在根本不同。 Yang 和 thrift or protobuff schema?
是的,我想它们确实相当于数据建模语言。一个人编写的模式文件是数据外观的模型,也可能是数据代表的模型。
例如,如果一个常用的数据组件表示轴承,那么与其简单地在任何地方使用 int
作为轴承,不如定义一个特定的 bearing
类型,然后使用它。这样做允许您更改用于 bearing
的原始类型,也许更改为 float
,而不必在其他任何地方进行更改。您可以在 Thrift、Protobuf 等中非常愉快地执行此操作。被称为 bearing
的类型没有余地假设它可能表示 time
,并且取决于实际使用的工具(模式编译器)可能最终无法在源代码中将 time
分配给 bearing
。这非常方便 - 开发人员必须非常努力地犯这样的错误。
然而,这暴露了Thrift和Protobuf的某些不足。 bearing
类型很好很好,但它不受约束。如果可以将模式中任何原语 (int
、float
) 的值限制为 0 到 359,那就更好了。
其他架构语言也这样做。 JSON 模式、XML 模式 (XSD) 和 ASN.1 模式的语言都具有允许模式编写者表达约束的语法。最终结果是,如果您的数据受到某种限制,这些模式可以更好地为您的数据建模。
ASN.1 约束尤其可以非常详尽,允许许多不同类型约束的逻辑组合(单个值、值范围、依赖于架构中别处设置的常量的范围、正则表达式、范围集,以及加载,加载更多)。这种复杂性的工具支持各不相同;贵的付费的还是值得的
代码中的实际结果已标记。对于 Thrift 和 Protobufs,你能做的最好的就是在 schema 中放一个注释,说一个数据组件的范围是有限的,希望开发者阅读注释并遵守它。这在一个 1 人团队中更有可能,在一个由许多开发人员组成的团队中则不太可能......如果被忽略,开发人员完全有可能构建包含 375 的 bearing
的消息(超出所需的约束) ,并且没有什么可以阻止它被序列化和传播除非开发人员专门编写代码来阻止这种情况。
而对于 ASN.1,模式具有作为模式语法一部分的约束,用于将该模式合并到项目中的工具将自动生成代码以检查被序列化或反序列化的数据是否符合.结果:不依赖开发人员阅读模式中的注释。这同样适用于 JSON 和 XSD,尽管根据我的经验,许多 XSD 工具在完全实现以 XSD 模式(例如 MS 的 xsd.exe 完全忽略约束)。我认为 JSON 验证器更好。
总而言之,是的,Thrift 和 Protobufs 可用于数据建模,但它们的模式语言不一定允许定义 "complete" 数据模型。其他模式语言更好,允许为数据定义值/大小约束,并在工具中提供不同级别的支持。
他们 none 所做的是允许表达数据的时间/行为/关系质量(即每秒发送一次消息),但如果有人试图拥有一个模式支持我怀疑它成为图灵完备的语言。在这种情况下,我们已经有很多现有的编程语言来支持它。
protobuff 和 thrift 都提供了数据定义功能——thrift 结构和 protobuff 消息。除了序列化格式之外,它是否使它们成为数据建模语言?
或者我们使用例如数据建模的方式存在根本不同。 Yang 和 thrift or protobuff schema?
是的,我想它们确实相当于数据建模语言。一个人编写的模式文件是数据外观的模型,也可能是数据代表的模型。
例如,如果一个常用的数据组件表示轴承,那么与其简单地在任何地方使用 int
作为轴承,不如定义一个特定的 bearing
类型,然后使用它。这样做允许您更改用于 bearing
的原始类型,也许更改为 float
,而不必在其他任何地方进行更改。您可以在 Thrift、Protobuf 等中非常愉快地执行此操作。被称为 bearing
的类型没有余地假设它可能表示 time
,并且取决于实际使用的工具(模式编译器)可能最终无法在源代码中将 time
分配给 bearing
。这非常方便 - 开发人员必须非常努力地犯这样的错误。
然而,这暴露了Thrift和Protobuf的某些不足。 bearing
类型很好很好,但它不受约束。如果可以将模式中任何原语 (int
、float
) 的值限制为 0 到 359,那就更好了。
其他架构语言也这样做。 JSON 模式、XML 模式 (XSD) 和 ASN.1 模式的语言都具有允许模式编写者表达约束的语法。最终结果是,如果您的数据受到某种限制,这些模式可以更好地为您的数据建模。
ASN.1 约束尤其可以非常详尽,允许许多不同类型约束的逻辑组合(单个值、值范围、依赖于架构中别处设置的常量的范围、正则表达式、范围集,以及加载,加载更多)。这种复杂性的工具支持各不相同;贵的付费的还是值得的
代码中的实际结果已标记。对于 Thrift 和 Protobufs,你能做的最好的就是在 schema 中放一个注释,说一个数据组件的范围是有限的,希望开发者阅读注释并遵守它。这在一个 1 人团队中更有可能,在一个由许多开发人员组成的团队中则不太可能......如果被忽略,开发人员完全有可能构建包含 375 的 bearing
的消息(超出所需的约束) ,并且没有什么可以阻止它被序列化和传播除非开发人员专门编写代码来阻止这种情况。
而对于 ASN.1,模式具有作为模式语法一部分的约束,用于将该模式合并到项目中的工具将自动生成代码以检查被序列化或反序列化的数据是否符合.结果:不依赖开发人员阅读模式中的注释。这同样适用于 JSON 和 XSD,尽管根据我的经验,许多 XSD 工具在完全实现以 XSD 模式(例如 MS 的 xsd.exe 完全忽略约束)。我认为 JSON 验证器更好。
总而言之,是的,Thrift 和 Protobufs 可用于数据建模,但它们的模式语言不一定允许定义 "complete" 数据模型。其他模式语言更好,允许为数据定义值/大小约束,并在工具中提供不同级别的支持。
他们 none 所做的是允许表达数据的时间/行为/关系质量(即每秒发送一次消息),但如果有人试图拥有一个模式支持我怀疑它成为图灵完备的语言。在这种情况下,我们已经有很多现有的编程语言来支持它。