# 数据建模的最佳实践

本部分介绍根据数据构建方式和需要实现的数据模型将数据加载到 Qlik Sense 应用程序中的各种不同方式。



## 将数据列转变为行

我的数据可能形式如此，我希望让销售数字位于单独的字段：

初始数据表

| 年 | Q1 | Q2 | Q3 | Q4 |
| --- | --- | --- | --- | --- |
| 2013 | 34 | 54 | 53 | 52 |
| 2014 | 47 | 56 | 65 | 67 |
| 2015 | 57 | 56 | 63 | 71 |

建议的操作

在您加载表格时，使用 Crosstable 前缀。

结果会如下所示：

在应用交叉表前缀后的表格

| Year | Quarter | Sales |
| --- | --- | --- |
| 2013 | Q1 | 34 |
| 2013 | Q2 | 54 |
| 2013 | Q3 | 53 |
| 2013 | Q4 | 52 |
| 2014 | Q1 | 47 |
| ... | ... | ... |

要了解有关交叉表的更多信息，请参阅[在数据加载脚本中使用交叉表](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/LoadData/work-with-cross-tables.htm)和[Crosstable](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptPrefixes/crosstable.htm)。

## 将数据行转变为字段

我具有带三个与此相似的字段的通用表格，我希望让每个属性采用单独表格的形式：

带三个字段的一般表格

| Object | Attribute | Value |
| --- | --- | --- |
| ball | color | red |
| ball | diameter | 25 |
| ball | weight | 3 |
| box | color | 56 |
| box | height | 30 |
| box | length | 20 |
| box | width | 25 |

建议的操作

使用通用加载前缀创建通用数据模型。

您将得到与此类似的数据模型：

![一般数据模型。](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Resources/Images/ex_gen_GenericDatabase_300x300.png)

要了解有关一般数据的更多信息，请参阅[通用数据库](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataSource/generic-databases.htm)和[Generic](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptPrefixes/Generic.htm)。

## 加载以层次级别（例如组织体系）组织的数据

我的数据存储在与此类似的相邻节点表中：

相邻节点表

| NodeID | ParentNodeID | Title |
| --- | --- | --- |
| 1 | - | General manager |
| 2 | 1 | Country manager |
| 3 | 2 | Region manager |

建议的操作

加载具有层次结构前缀的数据，创建扩展的节点表：

展开的节点表

| NodeID | ParentNodeID | Title | Level1 | Level2 | Level3 |
| --- | --- | --- | --- | --- | --- |
| 1 | - | General manager | General manager | - | - |
| 2 | 1 | Country manager | General manager | Country manager | - |
| 3 | 2 | Region manager | General manager | Country manager | Region manager |

要了解有关层次级别的更多信息，请参阅[加载层次结构数据](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataSource/hierarchies.htm)和[Hierarchy](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptPrefixes/Hierarchy.htm)。

## 仅从大型数据库加载新的或更新的记录

我有一个包含大量记录的数据库，并且我不想重新加载整个数据库以刷新我的应用程序中的数据。我只想加载新的或更新的记录，并移除已从数据库删除的记录。

建议的操作

使用 QVD 文件实施增量加载解决方案。

有关更多信息，请参阅[加载新的和更新的记录与增量加载](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/LoadData/use-QVD-files-incremental-load.htm)。

## 将来自两个表格的数据和公共字段整合

Qlik Sense 将自动把表格和通用字段关联，但是我希望控制组合表格的方式。

建议的操作 : Join / Keep

您可将两个表格组合为具有 Join 或 Keep 前缀的单个内部表格。

有关更多信息，请参阅[使用 Join 和 Keep 合并表](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/combine-tables-join-keep.htm)。

建议的操作 ：映射

接合两个表格的备选方法为使用映射，由此在映射表中自动查找相关值。这样可减少要加载的数据量。

有关更多信息，请参阅[将映射用作联接的替代](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/use-mapping-as-alternative-join.htm)。

## 将离散值和间隔匹配

我有离散数值表 (Event)，我希望将其和一个或多个间隔（Start 和 End）匹配。

离散数值表 (EventEvent)

| 时间 | 事件 | 注释 |
| --- | --- | --- |
| 00:00 | 0 | 班次 1 开始 |
| 01:18 | 1 | 生产线停止 |
| 02:23 | 2 | 生产线重新启动 50% |
| 04:15 | 3 | 生产线速度 100% |
| 08:00 | 4 | 班次 2 开始 |
| 11:43 | 5 | 结束或生产 |

带间隔的表格（StartStart 和 End End）

| 开始 | 结束 | 排序 |
| --- | --- | --- |
| 01:00 | 03:35 | A |
| 02:30 | 07:58 | B |
| 03:04 | 10:27 | C |
| 07:23 | 11:43 | D |

建议的操作

使用 IntervalMatch 前缀将 Time 字段和间隔关联，该间隔由 Start 和 End 定义。

有关更多信息，请参阅[离散数据的匹配间隔](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/LoadData/matching-intervals-to-discrete-data.htm)。

如果间隔未明确定义开头和结尾，只有类似下表中的更改时间戳，您将需要创建间隔表。

带更改时间戳的表格

| 货币 | 更改数据 | 评价 |
| --- | --- | --- |
| 欧元 | - | 8.59 |
| 欧元 | 28/01/2013 | 8.69 |
| 欧元 | 15/02/2013 | 8.45 |
| 美元 | - | 6.50 |
| 美元 | 10/01/2013 | 6.56 |
| 美元 | 03/02/2013 | 6.30 |

有关更多信息，请参阅[根据一个日期创建日期间隔](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/create-date-interval-from-single-date.htm)。

## 处理不一致的字段值

我的数据包含在不同表格中命名不一致的字段值。例如，一个表格在“国家/地区”字段包含值 US，而另一个表格则包含 United States。这种情况将阻止关联。

表格 1

| 国家/地区 | 区域 |
| --- | --- |
| 美国 | 马里兰州 |
| 美国 | 爱达荷州 |
| 美国 | New York |
| 美国 | 加利福尼亚州 |

Table 2

| Country | Population |
| --- | --- |
| United States | 304 |
| Japan | 128 |
| Brazil | 192 |
| China | 1333 |

建议的操作

使用映射表执行数据清理，由此将比较字段值并实现正确关联。

有关更多信息，请参阅[数据清理](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/LoadData/data-cleansing.htm)。

## 处理不一致的字段值首字母大写

我的数据包含在不同表格中格式不一致的字段值例如，一个表格包含值 single 于 Type 中，而另一个表格在相同字段包含 Single。该情况将阻止关联，因为 Type 字段将包含 single 和 Single 值、首字母大写的内容。

表格 1

| 类型 | 价格 |
| --- | --- |
| 单 | 23 |
| 双 | 39 |

表格 2

| 类型 | 颜色 |
| --- | --- |
| 单色 | 红色 |
| 单色 | 蓝色 |
| 双 | 白色 |
| 双 | 黑色 |

建议的操作

如果您通过添加数据来加载数据，则可在数据管理器中解决该问题。

执行以下操作：

1. 在数据管理器中，在表格编辑器中打开 Table2。

2. 将 Type 字段重命名为 Table2.Type。

   如果在启用数据分析后通过添加数据添加了表格，字段可能已命名为 Table2.Type 以防止自动关联。在该情况下，该程序将关联两个表格。

3. 使用表达式 `Lower(Table2.Type)` 创建计算的字段并将其命名为 Type。

4. 单击加载数据。

Table1 和 Table2 现在应当已通过字段 Type 关联，该字段仅包含小写的值，例如 single 和 double。

如果您希望使用不同的首字母大写，则也可通过相似的程序完成操作，但是要记住表格将使用具有相同名称的字段关联。

* 要让所有值大写，例如 Single，可改为创建计算的 Type 字段于 Table1 中，并使用表达式 `Capitalize(Table1.Type)`。
* 要让所有值为大写形式，例如 SINGLE，可在两个表格中创建计算的 Type 字段，并相应使用表达式 `Upper(Table1.Type)` 和 `Upper(Table2.Type)`。

要了解有关计算的字段的更多信息，请参阅[使用已计算字段](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/LoadData/add-calculated-field.htm)。

要了解有关大写的更多信息，请参阅[Capitalize 脚本和图表功能](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/StringFunctions/Capitalize.htm)、[Lower 脚本和图表功能](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/StringFunctions/Lower.htm) 和 [Upper 脚本和图表功能](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/StringFunctions/Upper.htm)。

## 加载地理空间数据以使用地图将数据可视化

我有希望用地图可视化的数据，例如按国家/地区或按商店划分的销售数据。要使用地图可视化，我需要加载区域或点数据。

建议的操作

您可从 KML 文件或 Excel 文件加载和您的数据值位置匹配的区域或点数据。此外，您需要加载实际地图背景。

有关更多信息，请参阅[加载您自己的地图数据](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/Visualizations/Map/load-map-data.htm)。