sqlite: широкий против длинного представления - PullRequest
0 голосов
/ 07 января 2019

Я рассматриваю вопрос о том, должен ли я отформатировать таблицу в моей базе данных 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    |

1 Ответ

0 голосов
/ 07 января 2019

«Длинный» формат является предпочтительным способом перехода по многим причинам. Во-первых, если вы используете «широкий» формат и когда-либо возникает необходимость добавить больше серий, вам придется добавить новые столбцы в таблицу базы данных. Хотя это не слишком сложно, в общем случае, когда вы запускаете схему в производство, вы хотите избежать дальнейших изменений схемы.

Во-вторых, «длинный» формат значительно упрощает создание отчетов и запросов. Например, предположим, что вы хотите получить количество строк / точек данных для каждой серии. Тогда вам нужно только что-то вроде:

SELECT series, COUNT(*) AS cnt
FROM yourTable
GROUP BY series;

Чтобы получить этот отчет в «широком» формате, вам понадобится намного больше кода, и он будет столь же подробным, как и приведенные выше примеры данных.

Следует помнить, что базы данных SQL созданы для работы с наборами записей (читай: между строками). Они также могут обрабатывать вещи по столбцам, но обычно они не настроены для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...