Sqlite: широкая v. длинная производительность

Я раздумываю, следует ли мне форматировать таблицу в моей базе данных 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    |
За пределами сигналов Angular: Сигналы и пользовательские стратегии рендеринга
За пределами сигналов Angular: Сигналы и пользовательские стратегии рендеринга
TL;DR: Angular Signals может облегчить отслеживание всех выражений в представлении (Component или EmbeddedView) и планирование пользовательских...
Sniper-CSS, избегайте неиспользуемых стилей
Sniper-CSS, избегайте неиспользуемых стилей
Это краткое руководство, в котором я хочу поделиться тем, как я перешел от 212 кБ CSS к 32,1 кБ (сокращение кода на 84,91%), по-прежнему используя...
0
0
203
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

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

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

Другие вопросы по теме