在 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 设计决策。