Как мне сопоставить таблицы с n столбцами в базе данных? - PullRequest
0 голосов
/ 02 марта 2019

В настоящее время мы используем PostgreSQL, теперь нужно сохранить некоторые таблицы в базе данных.Таблицы никогда не обновляются после создания, но могут быть отфильтрованы.

Таблицы являются динамическими по своей природе, поскольку могут быть столбцы n,

, поэтому таблица будет иметь вид:

|------|--------|--------|
| NAME | DATA 1 | DATA 2 |
|------|--------|--------|

другая таблица будет иметь вид:

|------|--------|--------|--------|--------|--------|
| NAME | DATA 1 | DATA 2 | DATA 3 | DATA 4 | DATA 5 |
|------|--------|--------|--------|--------|--------|

Данные не нормализованы, потому что это больно при работе со n строками, так как все строки читаются сразу.

Это решения, которые я придумаю,

  1. Сохранить таблицу как JSON в парах JSON Type или HStore.
  2. Сохранить таблицу как данные CSV в текстовом поле

Каковы альтернативные методысохранить вышеуказанные данные?Могут ли базы данных NoSQL обрабатывать эти данные?

Ответы [ 3 ]

0 голосов
/ 06 марта 2019

Из того, что вы описали, это звучит как работа для jsonb.Предполагая, что name является уникальным в определенной таблице, я могу представить что-то вроде этого:

create table test (
  tableId integer,
  name text,
  data jsonb,
  constraint pk primary key(tableId, name)
);
insert into test values (1, 'movie1', '{"rating": 10, "name": "test"}');
insert into test values (1, 'movie2', '{"rating": 9, "name": "test2"}');
insert into test values (2, 'book1', '{"rank": 100, "name": "test", "price": 10}');
insert into test values (2, 'book2', '{"rank": 10, "name": "test", "price": 12}');

По сути, идея состоит в том, чтобы использовать tableId для идентификации каждой вложенной таблицы и сохранения строк подтаблиц в этой одной БДТаблица.

Это открывает некоторые возможности:

  • создать отдельную таблицу для хранения метаданных о каждой вложенной таблице.Например, схема вложенных таблиц может храниться здесь для проверки уровня приложения.
  • частичный индекс для больших / горячих вложенных таблиц: create index test_1_movie_name on test ((data->>'name')) where tableid = 1
0 голосов
/ 07 марта 2019

Я не вижу в вашем вопросе ничего, что могло бы помешать вам использовать простые таблицы с соответствующим количеством столбцов данных.Это наиболее эффективная форма хранения на сегодняшний день .Наименьший размер хранилища, самые быстрые запросы.

Таблицы, которые "никогда не обновляются после создания, но могут быть отфильтрованы" , вряд ли являются "динамическими".Если вы не скрываете важные детали, это все, что есть.

И если не может быть более нескольких 100 столбцов.См .:

(Но вы позже прокомментировали максимум 12, чтоникаких проблем.)

0 голосов
/ 02 марта 2019

Динамический столбец означает схема меньше - опция, которую мы должны искать.MongoDB является предпочтительным.Мы храним как JSON?Если это так, Mongo поможет манипулировать данными / извлечение / отчетность облегчит жизнь.

Если вы не знакомы с NOSQL.MSSQL 2016 года и выше Хранение JSON в столбце поддерживается как varchar (MAX).SQL Server предоставляет функции для работы с данными JSON.Хотя это текстовый индекс по умолчанию для nvarchar.SQL поддерживает индексирование на основе вычисляемых столбцов, которое поможет обрабатывать элементы в JSON.Допускается любое количество вычисляемых столбцов некластеризованного индекса, что облегчит индексацию для обработки данных JSON.SQL 2019 имеет больше поддержки JSON

...