gpt4 book ai didi

.net - 反规范化数据集

转载 作者:行者123 更新时间:2023-12-02 02:37:56 24 4
gpt4 key购买 nike

我有一个数据集,其中包含一些数据表,这些数据表与数据关系(经典订单标题/详细信息对)链接在一起。有没有一种简单的方法可以将整个批处理非规范化为包含相关表的所有列的单个数据表?

表名和列在编译时是未知的,并且可能有两个以上的表/关系。

最佳答案

我自己也有同样的问题,但由于这个问题没有答案,我不得不自己编写反规范化器。事实证明这并不是那么困难 - 所以这是您(或遇到此问题的其他人)可能能够使用/扩展的第一个剪辑:

public class DataSetDenormalizer
{
public void DenormalizeRelationships(DataSet dataSet)
{
IOrderedEnumerable<DataRelation> orderedRelationship = SortRelationshipsByNumberOfChildRows(dataSet);
var tablesToRemove = new List<DataTable>();

foreach (DataRelation relationship in orderedRelationship)
{
DenormalizeColumns(relationship);
DenormalizeData(relationship);
RemoveDenormalizedRelationships(dataSet, relationship, tablesToRemove);
}
}

private IOrderedEnumerable<DataRelation> SortRelationshipsByNumberOfChildRows(DataSet dataSet)
{
var relationships = new List<DataRelation>();
foreach (DataRelation relationship in dataSet.Relations)
relationships.Add(relationship);
return relationships.OrderBy(r => r.ChildTable.Rows.Count);
}

private void DenormalizeColumns(DataRelation relationship)
{
for (int columnIndex = 0; columnIndex < relationship.ParentTable.Columns.Count; ++columnIndex)
{
DataColumn column = relationship.ParentTable.Columns[columnIndex];
if (relationship.ParentColumns.Contains(column)) continue;
relationship.ChildTable.Columns.Add(new DataColumn(column.ColumnName, column.DataType));
}
}

private void DenormalizeData(DataRelation relationship)
{
for (int rowIndex = 0; rowIndex < relationship.ChildTable.Rows.Count; ++rowIndex)
{
DataRow row = relationship.ChildTable.Rows[rowIndex];
DataRow parentRow = row.GetParentRow(relationship);

for (int columnIndex = 0; columnIndex < relationship.ParentTable.Columns.Count; ++columnIndex)
{
DataColumn column = relationship.ParentTable.Columns[columnIndex];
if (relationship.ChildTable.Columns.Contains(column.ColumnName))
{
row.SetField(column.ColumnName, parentRow[column]);
}
}
}
}

private void RemoveDenormalizedRelationships(DataSet dataSet, DataRelation relationship, List<DataTable> tablesToRemove)
{
dataSet.Relations.Remove(relationship);
relationship.ChildTable.Constraints.Remove(relationship.RelationName);

if (!tablesToRemove.Contains(relationship.ParentTable))
tablesToRemove.Add(relationship.ParentTable);

int numberOfColumns = relationship.ChildColumns.Length;
for (int columnIndex = 0; columnIndex < numberOfColumns; ++columnIndex)
{
relationship.ChildTable.Columns.Remove(relationship.ChildColumns[columnIndex]);
}
}
}

关于.net - 反规范化数据集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/522208/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com