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](https://i.stack.imgur.com/cLTP7.png)
Если картинка не загружается / вы хотите поиграть, вот 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;
Есть две основные проблемы с этой структурой:
- Целостность данных не надлежащим образом К одному столбцу может быть прикреплено 50 table_rows, а к другому только 1. Это разрешимо на прикладном уровне, однако.
- Работа с данными кажется довольно сложной: трудно получить такие вещи, как количество строк или разбиение на страницы. Сгруппированные предложения быстро вызывают головную боль с индексами и производительностью.
Я надеюсь, что есть какой-то механизм или шаблон проектирования, который я не знаю, который позволяет эффективно использовать таблицу с пользовательскими столбцами. Дополнительные баллы, если это также решает проблему целостности данных.
Одна простая вещь, которую можно сделать, это перевернуть отношение, где table_row ссылается на user_table, а table_column ссылается на table_row. Это облегчает подсчет строк, но получение всех столбцов указанной таблицы c затруднено.