Я раздумываю, следует ли мне форматировать таблицу в моей базе данных sqlite в "широком или" длинном "формате. Примеры этих форматов включены в конце вопроса.
Я ожидаю, что большинство моих запросов будут иметь форму:
SELECT * FROM table
WHERE
series in (series1, series100);
или аналог для выделения по столбцам в широком формате.
Я также ожидаю, что будет большое количество столбцов, даже достаточное для увеличения предел столбца.
Существуют ли какие-либо общие рекомендации по выбору макета таблицы, который оптимизирует производительность запросов для такого рода случаев?
«Широкий» формат:
| 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 |


«Длинный» формат здесь предпочтительнее по многим причинам. Во-первых, если вы используете «широкий» формат и когда-либо возникает необходимость добавить больше серий, вам придется добавлять новые столбцы в таблицу базы данных. Хотя это не слишком хлопотно, в целом, когда вы вводите схему в производство, вы хотите избежать дальнейших изменений схемы.
Во-вторых, «длинный» формат значительно упрощает создание отчетов и запросов. Например, предположим, что вы хотите получить количество строк / точек данных для каждой серии. Тогда вам понадобится только что-то вроде:
SELECT series, COUNT(*) AS cnt
FROM yourTable
GROUP BY series;
Чтобы получить этот отчет в «широком» формате, вам потребуется намного больше кода, и он будет таким же подробным, как и приведенный выше пример данных.
Здесь следует иметь в виду, что базы данных SQL созданы для работы с наборами записи (читайте: по строкам). Они также могут обрабатывать данные по столбцам, но обычно они не настроены на это.