我正在考虑是否要在sqlite数据库中以“宽”或“长”格式设置表的格式。问题末尾包括这些格式的示例。
我希望我的大部分请求都采用以下形式:
SELECT * FROM table
WHERE
series in (series1, series100);
或用于按宽格式按列选择的类似物。
我还希望会有大量的列,甚至足以增加column limit。
是否有选择用于优化这种情况下查询性能的表格布局的一般准则?
“宽”格式:
| date | series1 | series2 | ... | seriesN |
| ---------- | ------- | ------- | ---- | ------- |
| "1/1/1900" | 15 | 24 | 43 | 23 |
| "1/2/1900" | 15 | null | null | 23 |
| ... | 15 | null | null | 23 |
| "1/2/2019" | 12 | 12 | 4 | null |
“长”格式:
| date | series | value |
| ---------- | ------- | ----- |
| "1/1/1900" | series1 | 15 |
| "1/2/1900" | series1 | 15 |
| ... | series1 | 43 |
| "1/2/2019" | series1 | 12 |
| "1/1/1900" | series2 | 15 |
| "1/2/1900" | series2 | 15 |
| ... | series2 | 43 |
| "1/2/2019" | series2 | 12 |
| ... | ... | ... |
| "1/1/1900" | seriesN | 15 |
| "1/2/1900" | seriesN | 15 |
| ... | seriesN | 43 |
| "1/2/2019" | seriesN | 12 |
答案 0 :(得分:2)
出于多种原因,“长”格式是首选的选择。首先,如果您使用“宽”格式,并且永远需要添加更多系列,那么您将不得不向数据库表中添加新列。尽管这不太麻烦,但是通常在将模式投入生产后,您就希望避免进一步的模式更改。
第二,“长”格式使报告和查询变得更加容易。例如,假设您想获得每个系列的行数/数据点数。然后,您只需要类似以下内容:
SELECT series, COUNT(*) AS cnt
FROM yourTable
GROUP BY series;
要以“宽”格式获得此报告,您将需要更多代码,并且与上面的示例数据一样冗长。
这里要牢记的一点是,SQL数据库是为对记录集(可读取:跨行)而构建的。他们还可以按列处理事情,但是通常没有设置这样做。