Как спроектировать структуру базы данных для таблицы с установленными пользователем столбцами - PullRequest
0 голосов
/ 23 марта 2020

TLDR

Существует ли какой-либо механизм базы данных или шаблон проектирования, который позволяет представлять и использовать пользовательские столбцы в таблице?

Более длинная версия

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

В настоящее время используется Postgresql, если есть альтернативный механизм, который хорошо справляется с этой задачей, эта информация будет оценена.

Это будет выглядеть примерно так:

  predefined column  | user column1  | user column2  | user column3  | user column4 
 --------------------|---------------|---------------|---------------|-------------- 
                  0  |            1  |            2  |            3  |            4 
                  1  |            5  |            6  |            7  |            8 

А вот текущая структура базы данных:

enter image description here

Если картинка не загружается / вы хотите поиграть, вот SQL для нее

CREATE SEQUENCE user_table_id_seq INCREMENT BY 1 MINVALUE 1 START 1;
CREATE SEQUENCE available_column_id_seq INCREMENT BY 1 MINVALUE 1 START 1;
CREATE SEQUENCE table_column_id_seq INCREMENT BY 1 MINVALUE 1 START 1;
CREATE SEQUENCE table_row_id_seq INCREMENT BY 1 MINVALUE 1 START 1;
CREATE TABLE user_table (id INT NOT NULL, user_id INT NOT NULL, name VARCHAR(50) NOT NULL, PRIMARY KEY(id));
CREATE TABLE available_column (id INT NOT NULL, name VARCHAR(50) NOT NULL, PRIMARY KEY(id));
CREATE TABLE table_column (id INT NOT NULL, user_table_id INT NOT NULL, column_id INT NOT NULL, name VARCHAR(50) NOT NULL, PRIMARY KEY(id));
CREATE TABLE table_row (id INT NOT NULL, table_column_id INT NOT NULL, user_column INT NOT NULL, predefined_column INT NOT NULL, PRIMARY KEY(id));
CREATE INDEX IDX_35DE8775E3087FAA ON user_table (user_id);
CREATE INDEX IDX_35DE8775E3087FAB ON table_column (user_table_id);
CREATE INDEX IDX_35DE8775E3087FAC ON table_column (column_id);
CREATE INDEX IDX_35DE8775E3087FAD ON table_row (table_column_id);
ALTER TABLE table_column ADD CONSTRAINT IDX_35DE8775E3087FAE FOREIGN KEY (user_table_id) REFERENCES "user_table" (id) NOT DEFERRABLE INITIALLY IMMEDIATE;
ALTER TABLE table_column ADD CONSTRAINT IDX_35DE8775E3087FAF FOREIGN KEY (column_id) REFERENCES "available_column" (id) NOT DEFERRABLE INITIALLY IMMEDIATE;
ALTER TABLE table_row ADD CONSTRAINT IDX_35DE8775E3087FBA FOREIGN KEY (table_column_id) REFERENCES "table_column" (id) NOT DEFERRABLE INITIALLY IMMEDIATE;

Есть две основные проблемы с этой структурой:

  1. Целостность данных не надлежащим образом К одному столбцу может быть прикреплено 50 table_rows, а к другому только 1. Это разрешимо на прикладном уровне, однако.
  2. Работа с данными кажется довольно сложной: трудно получить такие вещи, как количество строк или разбиение на страницы. Сгруппированные предложения быстро вызывают головную боль с индексами и производительностью.

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

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

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