sql-server - 表设计 - 宽表与作为属性的列

标签 sql-server database-design

我是使用 SQL Server 2012 构建操作数据存储 (ODS) 数据库的团队的一员,我们的一些分析师将使用该数据库进行预测建模。 ODS 将包含我们制造的单个产品的制造生产数据。

我们将在 ODS 中有数百个表。但是,我们将有一个核心表,其中包含有关制造的每个项目(每年数千万)的关键信息(生命周期信息)。我们的产品是在制造工厂制造的,沿着生产线经过各种流程大约需要 2.5 小时。我们想在这个核心表中存储各种单独的制造和后期制造信息。一个示例数据可能是产品进入特定 toastr 的时间。

我们要决定如何设计这张 table 。我们可以创建一个宽表(多列)或一个窄表,其中大多数列是行(作为属性值)。我从未设计和使用过非常窄且列被视为表中的行的表结构。

我想要一些关于宽 table 与窄 table 优缺点的反馈。以下内容可能有助于讨论:

每年生产的产品数量:数百万(每个产品实例都会在核心表中排成一行)

是否经常查询此表:是的,经常查询。它将是许多子表的父表。

潜在的列数(或行属性):75 到 150+

如果更多信息有用,我很乐意提供。

最佳答案

宽表,静态属性

您正在通过明确定义的制造过程跟踪单个产品。这个数据模型听起来非常静态,并且适用于包含许多始终填充数据的列的宽表。

窄表,动态属性

如果你有很多很多产品在制造过程中有很多变化,它会更适合狭窄的 table ,在那里你可以轻松地添加新的跟踪属性。

窄表查询困难

然而,即使是对窄表的简单查询也非常困难。例如,当某个属性在 100 多个其他属性行中混洗时,如果您需要按某个属性对数据进行排序,该怎么办?您如何将所有行放在一起形成一个“记录”,然后对结果集中的记录组进行排序?

扁平表更易于查询

根据您需要如何查看和分析数据,您可能会发现自己经常使用数据透视表或交叉表查询。如果是这样,那么为什么不从一开始就将存储表展平呢?

或者两者都做

另一种选择是两者兼而有之:严格存储数据,并使用转换过程将其展平以便于报告。这样您就可以快速开始跟踪新属性(只需添加行),然后您就可以更新报告表和转换过程以利用新数据。

关于sql-server - 表设计 - 宽表与作为属性的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16447903/

相关文章:

sql - 将句子中的单词替换为另一个表中的单词

c# - 业务层设计困境 : memory or IO?

java - 用于联系人列表的 Hibernate Pojo 设计

sql-server - 在两个连续行之间插入记录的最佳方法是什么?

sql-server - 如何更改保管箱文件夹的路径

c# - datetimeoffset.datetime 问题?

php - 如何设计高效的Like系统?

mysql - 在mysql中导出表

mysql - wordpress 数据库不应该规范化吗?

SQL 查询——如何找到最低的 2 个数字