在 SQL 或我的应用程序代码中转换数据更好吗?
Is it better to pivot data in SQL or in my application code?
我在 MSSQL 数据库中有一个很长很窄的 table,看起来有点像:
date
dataItemName
dataItemValue
2021-01-01
Units Sold
20
2021-01-01
# Customers
2948
2021-01-01
ARP
19
2021-01-02
Units Sold
146
2021-01-02
# Customers
157
2021-01-02
ARP
32
我正在尝试获取 table 的形式:
date
Units Sold
# Customers
ARP
2021-01-01
20
2948
19
2021-01-02
146
157
32
我的问题是:是否有充分的理由在 SQL 中旋转 table(创建视图或物化 table)与提取原始数据并在其中进行旋转我的申请?
您正在处理 key/value table。幸运的是,至少该值似乎始终是数字,因此 dataItemValue
列可以是数字,因此像 Units Sold = 'many'
或 # Customers = 'I don''t know'
这样的值是不可能的。但是 key/value table 总是让人讨厌。
在 SQL
中旋转的优点
- 要传输的数据较少。
date, Units Sold, # Customers, ARP
的一行比 date, dataItemName, dataItemValue
. 的三行数据少
- 如果您创建一个视图,您会使其看起来像是在处理一个普通的 table。您的查询变得更易读并且更不容易出错。
在您的应用中旋转的优点
- 如果你添加一个键,比如 dataItemName = 'highest price' 你所有的查询(希望你的应用程序也是)将保持不变,毕竟这就是 key/value 设计的全部内容.
理想情况下,您使用 key/value table,因为密钥与您的应用无关。比如说,你有产品,有些有项圈类型,有些有最高温度,有些有最高速度。您的产品创建应用程序将允许您的员工输入数据,您的销售应用程序或 Webste 将显示数据。这两个应用程序都不需要知道衣领类型或最高温度的含义。在那种情况下,您将 select(未知的)原始数据,您的应用程序将进行数据透视(如果需要的话)。
但是,在您的情况下,key/value table 似乎不太合适。你想处理某些属性,就好像它们是 table 中的真实列一样,你的应用程序应该知道 Units Sold
和 # Customers
的含义。在这种情况下,您最好对这些列使用普通的 table。如果您被迫使用 key/value table,请充分利用它。以 SQL 为中心,最好是在视图中,这样您就不会注意到不恰当的 table 设计决策。
我在 MSSQL 数据库中有一个很长很窄的 table,看起来有点像:
date | dataItemName | dataItemValue |
---|---|---|
2021-01-01 | Units Sold | 20 |
2021-01-01 | # Customers | 2948 |
2021-01-01 | ARP | 19 |
2021-01-02 | Units Sold | 146 |
2021-01-02 | # Customers | 157 |
2021-01-02 | ARP | 32 |
我正在尝试获取 table 的形式:
date | Units Sold | # Customers | ARP |
---|---|---|---|
2021-01-01 | 20 | 2948 | 19 |
2021-01-02 | 146 | 157 | 32 |
我的问题是:是否有充分的理由在 SQL 中旋转 table(创建视图或物化 table)与提取原始数据并在其中进行旋转我的申请?
您正在处理 key/value table。幸运的是,至少该值似乎始终是数字,因此 dataItemValue
列可以是数字,因此像 Units Sold = 'many'
或 # Customers = 'I don''t know'
这样的值是不可能的。但是 key/value table 总是让人讨厌。
在 SQL
中旋转的优点- 要传输的数据较少。
date, Units Sold, # Customers, ARP
的一行比date, dataItemName, dataItemValue
. 的三行数据少
- 如果您创建一个视图,您会使其看起来像是在处理一个普通的 table。您的查询变得更易读并且更不容易出错。
在您的应用中旋转的优点
- 如果你添加一个键,比如 dataItemName = 'highest price' 你所有的查询(希望你的应用程序也是)将保持不变,毕竟这就是 key/value 设计的全部内容.
理想情况下,您使用 key/value table,因为密钥与您的应用无关。比如说,你有产品,有些有项圈类型,有些有最高温度,有些有最高速度。您的产品创建应用程序将允许您的员工输入数据,您的销售应用程序或 Webste 将显示数据。这两个应用程序都不需要知道衣领类型或最高温度的含义。在那种情况下,您将 select(未知的)原始数据,您的应用程序将进行数据透视(如果需要的话)。
但是,在您的情况下,key/value table 似乎不太合适。你想处理某些属性,就好像它们是 table 中的真实列一样,你的应用程序应该知道 Units Sold
和 # Customers
的含义。在这种情况下,您最好对这些列使用普通的 table。如果您被迫使用 key/value table,请充分利用它。以 SQL 为中心,最好是在视图中,这样您就不会注意到不恰当的 table 设计决策。