问题标签 [surrogate-key]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
sql - 在数据仓库中使用代理键的优缺点
代理键是我们书中多年来一直存在的一种机制,我讨厌再次将其带入讨论。每个人都在谈论使用代理密钥而不是业务密钥的好处。甚至 Microsoft Analysis Services 表格模型和 Microsoft PowerBI 表格模型也在使用代理键。提到的两个平台都使您能够使用一列连接维度和事实,因此是代理键,因为在现实生活中很难拥有一个单一的业务键。
在最近几年担任 BI 架构师时,我曾与 Analysis Services Multidimensional 和 Tabular 合作,我在 Multidimensional 中有过项目,每晚在 DataWarehouse 中管理高达 500GB 的数据。我面临着从具有数百万条记录的表中的 5-6 个联合和 8-10 个连接收缩的事实。
问题来了,使用代理键,为了能够知道我们需要进行额外连接的维度键。因此,如果我们希望能够将 N 个维度(尚未与构造表达式中的事实相关联)与单个事实“关联”,我们需要在 DataWarehouse 中添加 N 个额外的连接。
让我们以前面的例子为例,所以对于这个特定的事实,我们需要 5-6 个联合 + (8-10 + N) 个连接,这增加了复杂性,一旦我们需要将这个事实与 10-15 联系起来会发生什么尺寸来获取代理键。
这些年来,我一直在尝试使用我早期的咖啡来阅读我的事实表达式,就像阅读报纸一样,删除未使用的列、联合、连接,并使一切都降低复杂性以节省 ETL 处理时间。
它完全理解我们将节省查询数据仓库和语义层的时间,但是 ETL 呢,我错过了什么?
data-warehouse - 如何获得正确的表作为具有相关键的事实表?(星型模式)
我在为事实表选择合适的表时遇到问题。我对以下两个表有疑问
订单数据表:
- 订单编号
- 客户ID
- 订单状态
- 订单购买
- 订单批准时间
- OrderDeliveredCarrier
- 订单交付客户
- 订单估计已交付
订单项表:
- 订单编号
- 订单项 ID
- 产品编号
- 卖家ID
- 发货期限
- 价格
- 重量级
事实表适合什么表?我的数据源是https://www.kaggle.com/olistbr/brazilian-ecommerce
请给我一个支持。
bigdata - 分布式系统的代理键
我是大数据世界的新手,我想问一个关于代理键的问题。考虑到分布式数据系统,使用哈希 md5 创建代理键似乎很有趣。同时,md5 使用属性连接。我的问题:
是否倾向于使用 md5 哈希而不是简单地使用某些属性的串联作为代理键?
sql - DBT 'dbt snapshot' 命令导致错误:“快照快照名称中的数据库错误无法识别名称:id at [53:13]”
正如问题所说,我正在运行dbt snapshot
命令并且我的一些快照不起作用,因为 DBT 没有识别id
我创建的代理键。我的快照都是以相同的方式构建的,它们所基于的基本视图也是如此。以下是由于无法识别代理键而无法正常工作的快照示例:
接下来是它引用的基本视图的示例:
请记住,当我运行该命令时dbt run -m [base_example]
,它会生成一个视图,在该视图中我可以看到生成为代理键的哈希值。问题仅在我运行时出现dbt snapshot
。事实上,dbt snapshot --select [example_snapshot]
一次只运行一个快照不会给我任何快照的任何错误。最令人困惑的部分:我有一个基本视图和该基本视图的快照,其配置与其他 3 个不工作的视图完全相同,但它在创建快照时识别代理键。我很困惑,任何帮助将不胜感激。
postgresql - 使用以表标识号为后缀的 ID 有哪些缺点?
我正在玩:
在我看来,这有以下好处:
- 每个 id 在整个数据库中都是唯一的,从而消除了错误的表错误。
- 没有 id 的值小于 10,000,消除了与大多数迭代计数器的混淆。
- 包含表很容易从任何 id 的最后两位数字中学习。
缺点:
- 我们浪费了 99% 的 ID。
我没有考虑到哪些其他缺点?
sql - 根据其他列格式化代理键
我在 SQL Server 中有一个表
我希望我的 registerNumber 类型为 batch+branch+id
例如学生 id:1、batch:17、branch:BIT 中的一行,那么 registerNumber 应该是 17BIT1
我试图通过在创建表中使用默认值来做到这一点,但它不允许我引用同一个表的列
编辑
谢谢你给我的答案sql - 如何在 ETL 期间用代理键替换主键?
有一个困扰我一段时间的问题。
在 ETL 过程中,如何用代理键替换主键?就像工作流程一样 - 它只是分配新的身份吗?如果是这样,以前的值如何,如何用新创建的业务键替换现有的业务键?
在我看来,一个特定的工作流程如下所示,但我还没有在实践中完成它:
- 删除 DimProduct 和 FactSales 表中的现有 PK_Product 和 FK_Product。
- 将新的 IDENTITY 列设置为 dimProduct。
- 将新列添加到 FactSales,其值来自基于先前业务键联接的新创建的 IDENTITY 列。
- 删除两个表中的旧 ProductKey 列。
- 为新创建的代理 IDENTITY 键添加约束。
- 为未来的值分配表之间的参考。
但请告诉我你在工作中是如何做到这一点的并纠正我,因为我认为我错了。
sql-server - 创建一个哈希键作为唯一键
我有一个非常大的表,其中包含重复的名称和地址信息。该表提供一个执行任务并将结果附加回表的进程。我想通过在名称和地址信息上创建一个哈希键来减少输入这个过程的数量。这样我可以为每个哈希键提供一条记录,从而减少 75% 的输入。而且我需要这个密钥随着时间的推移保持不变。
但是,由于此哈希键将作为我加入结果表的键,因此我需要它是唯一的。我可以将哈希键创建为持久列,并给它一个唯一的约束,但我担心碰撞的可能性很小。如果两个不同的名称和地址字符串可能产生相同的哈希输出,我仍然需要它们的唯一键。
即使这种情况不太可能发生,我也不高兴知道如果发生了,我就没有计划。
我还考虑过使用表的代理 ID,并使用 MIN(surrogateID) 分配一组名称和地址中的每条记录。但是,如果删除了与给定组的 MIN(surrogateID) 对应的记录,那么现在我的 ID 已更改。
我可以创建一个包含不同名称和地址的查找表,并为每个人提供一个简单的整数 ID。但我宁愿避免存储成本。
还有其他我可能不会考虑的选择吗?
phpmyadmin - 我们在 phpmyadmin 中使用的键是主键还是代理键?
如果两者都是唯一键,则主键和代理键之间有什么区别。主键的作用与 phpmyadmin 中的代理键相同。我在视频中听说代理键独立于表的其他列。还有它与事实表和维度表有什么关系。