2021-08-28 10:33:22
在数据模型设计中,复合键和代理键各有其适用场景和优缺点。
复合键:
定义:由多个标识字段组成,这些字段组合在一起是唯一的。
特点:由现实世界的值创建,其含义在阅读时可以理解。
适用场景:当你仍然希望维护数据值时,复合键是理想的。虽然复合键是字段的唯一组合,但你可以根据这些值生成一个新字段,以便更容易地进行记录的唯一查找。
生成方法:使用基本的 SQL 创建复合键非常简单,你只需要连接两个或更多的字段。在做这件事之前,确保检查 NULL 值。如果这些字段中的任何一个可能是 NULL,你需要想出如何处理,以确保这些 NULL 值不会持续存在于你的复合键中。如果使用数据转换工具如 dbt,我强烈建议将这个简单的函数转换成一个宏,你可以在多个不同的数据模型中重复使用。
代理键:
定义:为了成为主键而生成的,不包含任何现实世界的意义。
特点:通常是使数据检索快速简便的哈希值。
适用场景:当你不需要维护数据值,并希望有一个快速高效的数据检索方式时,代理键是理想的。这些通常用于数据集在 3 个或更多字段上是唯一的情况下,使得复合键难以使用。它们也用于非常大的表中,其中复合键可能不实用。
生成方法:要生成代理键,你可以基于我们用来生成复合键的相同逻辑。你只需将 MD5 函数添加到连接字段中。SQL 中的 MD5 函数返回一个字符串的 128 位校验和,可以用作哈希键。注意一点——确保用于生成这些键的字段的数据类型在所有生成它们的位置都是相同的。如果数据类型不同,键值将会变化。dbt 在 dbt_utils 包中有一个特别有用的函数用于生成代理键,这是作为包的一部分。最好的部分是它为你处理任何 NULL 值,因此你不需要自己构建这个逻辑。
在选择使用复合键还是代理键时,需要考虑以下因素:
结论:数据建模需要做出很多架构选择,尤其是在键的选择上。选择正确的键可以使你的数据模型更加用户友好、更快、更高效。在决定使用复合键还是代理键时,务必记住以上 3 件事,让这些问题引导你决定为你的模型做出哪些架构决策。