Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.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 使用父行ID设计事实表_Sql_Sql Server 2012_Data Warehouse - Fatal编程技术网

Sql 使用父行ID设计事实表

Sql 使用父行ID设计事实表,sql,sql-server-2012,data-warehouse,Sql,Sql Server 2012,Data Warehouse,我一直在做我的第一个数据仓库设计,遇到了一个我无法找到答案的问题 事实表中的每一行都需要标识“父”记录的RowID。在我的例子中,每个装运事件都会导致后续事件属于该行。如果产品被重新装运,那么以下产品属于该新行,以此类推 然而,由于各种原因,并非所有产品都有发货历史记录。因此,将这些行设为空 事实表中的每一行都有一个唯一的id,因此我可以引用它,但我应该将此关系存储在哪里?我是否为ParentRowId在事实表中添加了一个可为null的列?我是否创建一个无事实的事实表来定义关系 我倾向于第一种选

我一直在做我的第一个数据仓库设计,遇到了一个我无法找到答案的问题

事实表中的每一行都需要标识“父”记录的RowID。在我的例子中,每个装运事件都会导致后续事件属于该行。如果产品被重新装运,那么以下产品属于该新行,以此类推

然而,由于各种原因,并非所有产品都有发货历史记录。因此,将这些行设为空

事实表中的每一行都有一个唯一的id,因此我可以引用它,但我应该将此关系存储在哪里?我是否为ParentRowId在事实表中添加了一个可为null的列?我是否创建一个无事实的事实表来定义关系


我倾向于第一种选择,但不确定在这种情况下什么是“合适的”。如果这对SQL Server 2012有影响的话,每年大约有300万行。

我总是构建一个单独的表来做“桥接表”、“覆盖率表”和类似的事情。无论如何,您都必须进行联接(自联接)才能找到父级,因此,将该联接连接到负责保持这种关系的表中并没有什么害处。

每年有300万行,性能和存储似乎与您无关。@usr尽管如此,我仍然想理解正确的方法我不能很好地理解你的例子。哪一个是事实表的颗粒?这是一批货吗?这是装运历史记录吗?在任何情况下,事实表中的null键都不是“正确的”。@mombo粒度是单个单元(序列号)的事件。因此,一系列事实将是装运>退货>装运>索赔>索赔>退货>装运>索赔。。。8事实。虽然正如我所说,这是理想的,因为可能不存在装运,因此为什么会存在空值