在Redshift中,我们有一个表(我们称之为entity
_ hierarchy_id
_下一个)。
因此:
此外,该表是根据 分布和排序的。entity_timestampt
hierarchy_id
A
B
C
hierarchy_id == A.a_id || '-' || B.b_id || '-' || C.c_id
DISTKEY(hierarchy_id)
COMPOUND SORTKEY(hierarchy_id, entity_timestampt)
在这张表上,我们需要生成多个报告,其中一些被固定到层次结构的深度级别,而另一些将被更高的部分过滤,并按较低的部分对结果进行分组。但是,层次结构的第一层(A
维度)定义了我们的安全模型,用户永远无法访问A
他们所属的维度以外的其他维度(这是我们的租户信息)。
当我们用纯SQL对报告进行原型设计时,当前的设计被证明是有用的,因为我们可以为深度查询做这样的事情:
WHERE
entity.hierarchy_id = 'fixed_a_id-fixed_b_id-fixed_c_id' AND
entity.entity_timestampt BETWEEN 'start_date' AND 'end_data'
或者像这样通过层次结构的其他点进行过滤:
WHERE
entity.hierarchy_id LIKE 'fixed_a_id-%' AND
entity.entity_timestampt BETWEEN 'start_date' AND 'end_data'
即使我们仅针对层次结构的部分路径进行过滤,它仍然可以利用DISTKEY
&设置。SORTKEY
现在我们想使用QuickSight使用嵌入功能创建和共享这些报告。但是我们还没有找到一种方法来过滤我们想要的分析数据。
我们尝试通过标签对匿名用户使用RLS,但我们发现了两个问题:
- 如何在 API 中以安全的方式(即用户无法更改它)
A.a_id
注入生成嵌入 URL 的查询部分,同时允许他们配置层次结构的其他部分。最后在过滤器中组合这些独立的部分;无需在每次用户更改其他部分时生成新的 URL。(但是,我们可能会忍受这种限制,但是)
- 如何进行部分过滤;即看起来像的那些
LIKE 'fixed_a_id-fixed_b_id-%'
因为看起来RLS总是一个相等的条件。
有什么方法可以让QuickSight在我们当前的表格设计中按照我们想要的方式工作?还是我们需要改变设计?
对于后者,我们考虑将三个维度 id 保留为单独的列,这样我们可以为列添加 RLSA.a_id
并为其他列使用参数,问题在于按层次结构的较低部分分组的报告,目前尚不清楚我们如何定义DISTKEY
andSORTKEY
以便正确优化查询。