Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 合并相同的表但保持单独的引用完整性_Sql_Database_Postgresql_Foreign Keys_Referential Integrity - Fatal编程技术网

Sql 合并相同的表但保持单独的引用完整性

Sql 合并相同的表但保持单独的引用完整性,sql,database,postgresql,foreign-keys,referential-integrity,Sql,Database,Postgresql,Foreign Keys,Referential Integrity,考虑一个具有事实表的维度模型,如(fk_dim1value,fk_dim2 value,…,value),其中fk_X列是对应的普通维度表的外键dim1value(id,value),dim2 value(id,value),等 这些事实和维度表是从不同的来源自动收集的,所以有很多。。。它们是冗余的:所有维度值表在结构上都是相同的,(id,value),表示简单的文本值集合,没有进一步的语义(唯一的区别是在各种事实表中引用它们的不同外键)。稍后可能会出现不那么琐碎的维度类型,但不同类型的维度集仍

考虑一个具有事实表的维度模型,如
(fk_dim1value,fk_dim2 value,…,value)
,其中
fk_X
列是对应的普通维度表的外键
dim1value(id,value),dim2 value(id,value),

这些事实和维度表是从不同的来源自动收集的,所以有很多。。。它们是冗余的:所有维度值表在结构上都是相同的,
(id,value)
,表示简单的文本值集合,没有进一步的语义(唯一的区别是在各种事实表中引用它们的不同外键)。稍后可能会出现不那么琐碎的维度类型,但不同类型的维度集仍然很小

因此,我想将维度表合并到一个表
dimvalue(fk\u dim,dimvalue\u id,value)
中,其中
fk\u dim
引用一个表
dimension(dim\u id,name)
,并且
dimvalue\u id
仅在每个维度中是唯一的。然后,自然主键被合成:
(fk\u dim,dimvalue\u id)

事实表外键列现在都引用相同的表,
dimvalue(fk\u dim,dimvalue\u id,value)
。。。但是,当然,每一列都与一个特定的维度相关联,因此仍应限于具体引用该维度的值(统一表的水平分区
dimvalue

有没有(明智的)方法来做到这一点

我的意思是类似于“半复合”外键的东西,即对复合PK的“切片”的单个列引用,其他列具有固定值。“完全复合”FK将是
外键(col1,col2)引用dimvalue(FK_dim,dimvalue_id)
,但此处
FK_dim
是固定的,因此键的“主”侧仅为一列,引用
dimvalue
主键的第二列;类似于
外键(fk_dim7value)的内容引用dimvalue(fk_dim=7,dimvalue\u id)

这样可能吗?还是我在最后一段迷路了?我是否应该放弃,只对整个
dimvalue
表使用外键,然后添加检查约束以按维度限制?还是引用完整性要求我放弃更多,只接受所有单独的相同表


(约束对写入性能的影响并不重要;读取性能是一个设计目标。)

您已经说明了这些关键注意事项

  • 数据是从不同的系统收集的,因此我认为这是一个“报告”表,而不是“操作”或“事务”类型的系统
  • 每个事实表每行包含一条业务数据,即“值”列
  • 事实表似乎只包含一个“度量”或“事实”
  • 写性能无关紧要,只有读性能才是目标。这证实了我的结论,即这是一个“报告”表
考虑到你追求的是快速阅读性能,我会选择“大桌子”设计。当然,大表设计对于事务系统来说是可怕的,但这不是一个。我指的是大桌子 表(DIM1VALUE、DIM2VALUE、DIM3VALUE、DIM4VALUE…DIMN值、FACTVALUE)

您的维度表仅包含1列业务数据,因此请跳过查找。索引每一列(事实值除外),然后测试查询的性能

加载大表时,可以检查数据质量值,并标记/寻址超出预期范围的值


现在,如果维度表的数量过多,您可以将大表拆分为多个组,其中分组基于逻辑使用情况,例如,如果维度中的10个属性始终一起使用,则将它们放在BIGTABLE1中,依此类推。

您已经说明了这些关键注意事项

  • 数据是从不同的系统收集的,因此我认为这是一个“报告”表,而不是“操作”或“事务”类型的系统
  • 每个事实表每行包含一条业务数据,即“值”列
  • 事实表似乎只包含一个“度量”或“事实”
  • 写性能无关紧要,只有读性能才是目标。这证实了我的结论,即这是一个“报告”表
考虑到你追求的是快速阅读性能,我会选择“大桌子”设计。当然,大表设计对于事务系统来说是可怕的,但这不是一个。我指的是大桌子 表(DIM1VALUE、DIM2VALUE、DIM3VALUE、DIM4VALUE…DIMN值、FACTVALUE)

您的维度表仅包含1列业务数据,因此请跳过查找。索引每一列(事实值除外),然后测试查询的性能

加载大表时,可以检查数据质量值,并标记/寻址超出预期范围的值


现在,如果您的维度表数量过多,您可以将大表拆分为多个组,其中分组基于逻辑用法,例如,如果维度中的10个属性始终一起使用,则将它们保存在BIGTABLE1中,依此类推。

;你说得对,这是一个“报告”模式,但我不喜欢“大表”方法。它会扩大事实表的宽度(维度值可以很宽),使查询I/O变得繁重。这不会为我节省太多,因为我通常可以避免连接到维度表。这将把我与这个唯一微不足道的维度值模型联系起来,它不是永久性的(对不起,我不清楚这一点;我已经修改了这个问题。)谢谢;你说得对,这是一个“报告”模式,但我不喜欢“大表”方法。它会扩大事实表的宽度(维度值可以很宽),从而使查询I/O增加