powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Научите как сделать это правильно
5 сообщений из 5, страница 1 из 1
Научите как сделать это правильно
    #33078920
Добрый день.

Крайне необходимо помощь в проектировании кусочка системы, , предназначенной для полуавтоматического отправления форм, заполненных данными из нескольких "источников".

В настоящий момент я пришел к такой схеме

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
CREATE TABLE batch (
	id serial PRIMARY KEY,
	name varchar( 50 ) not null,
);

CREATE TABLE action ( 
	id serial PRIMARY KEY,
	batch_id int,
	name varchar( 50 ),
	form_url varchar( 255 ),
	target_url varchar( 255 ),
	referrer varchar( 255 ),
	method varchar( 4 ),
	action_order integer NOT NULL,
);

CREATE TABLE action_variable ( 
	id serial PRIMARY KEY,
	name VARCHAR( 255 ),
	source_type TINYINT,
	source_id INTEGER
);

Каждая запись в таблице batch связана с одной или более записью в таблице action, смысл этой конструкции в том, чтобы обеспечить возможность последовательной отправки нескольких форм в пределах одного пакета (например, если перед отправкой необходимо пройти авторизацию). Каждая запись в таблице action связана с одной или более записью в таблице action_variables, предназначеной для хранения переменных, которые необходимо отправить. С этой частью и возникли затруднения, но об этом чуть ниже.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
CREATE TABLE submission (
	id serial PRIMARY KEY,
	iname varchar( 50 ),
	completed boolean  not null default false
);

CREATE TABLE submission_to_batch (
	submission_id integer references submission ON DELETE CASCADE,
	batch_id integer references batch ON DELETE CASCADE,
	completed boolean not null default false,
	PRIMARY KEY (submission_id, batch_id)
 );
Далее, каждая запись в таблице submission ассоциирована с одним или более командным пакетом посредством ссылочной таблицы. Таким образом возможно добавить набор пакетов и выполнить их все, используя в качестве источников значений переменных (action_variables) данные из следующих источников:

1. system-wide source (не знаю как и перевести)
системные переменные, к примеру имейл для обратной связи или URL системы

2. batch-specific source
данные, ассоциированные с кокретным пакетом

3. form field source
поля для заполнения, например Title или Text Body, эти данные будут использоваться для рендеринга формы при создании submission, данные из заполненной формы будут сохраняться (еще одна таблица, между field_source и submission)

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

Любой пинок в правильном направлении будет принят с благодарностью.
Прошу прощения за некоторую невнятность, если я упустил что-то важное, я уточню.
Заранее спасибо, совсем еще маленький девелопер.
...
Рейтинг: 0 / 0
Научите как сделать это правильно
    #33079349
Фотография Medvich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если я все с просонья правильно понял, то если не боишься тормозов, то можно сделать типа так:

--таблица типов
CREATE TABLE OBJ_TYPES(
TID int, -- идентификатор типа (PK)
NMType varchar(50) not null -- имя типа
);

--таблица полей
CREATE TABLE OBJ_FIELDS(
FID int, -- идентификатор поля (PK)
NMFIELD varchar(50) not null -- название поля
);

--таблица связи типа с полем
CREATE TABLE OBJ_TYPE_DESCRIPTION(
TID int, -- идентификатор типа (FK на TABLE OBJ_TYPES.TID)
FID int -- идентификатор поля (FK на TABLE OBJ_FIELDS.FID)
);

--таблица экземпляров
CREATE TABLE OBJ_EXEMPLAR(
EID int, -- идентификатор экземпляра (PK)
TID int -- идентификатор типа (FK на TABLE OBJ_TYPES.TID)
);

--таблица значений полей экземпляра
CREATE TABLE OBJ_FIELD_VALUES(
VID int, -- идентификатор поля (PK)
FID int -- идентификатор поля (FK на TABLE OBJ_FIELDS.FID)
VAL sql_variant -- значение поля
);

--таблица связи экземпляра с значениями его полей
CREATE TABLE OBJ_EXEMPLAR_REL(
EID int, -- идентификатор экземпляра (FK на TABLE OBJ_TYPES.TID)
VID int, -- идентификатор поля (FK на TABLE OBJ_FIELD_VALUES)
);

надеюсь за такой констракшн меня никто сильно не отпинает, основная идея такова, что есть тип данных OBJ_TYPES описывающий некую сущность имеющую набор атрибутов TABLE OBJ_FIELDS, и есть экземпляры типов OBJ_EXEMPLAR с значениями полей OBJ_FIELD_VALUES.. остается написать функционал а ля: addType, addField, addFieldToType, removeField , removeType, addExemlar, setExemplarFieldValue, removeExemplar ну и т.д. часть смело на триггерах делается..
...
Рейтинг: 0 / 0
Научите как сделать это правильно
    #33079735
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно иметь единую таблицу значений переменной:
Код: plaintext
1.
2.
3.
4.
CREATE TABLE variable_value ( 
	variable_id integer NOT NULL references variable_definition,
	batch_id integer NULL references batch ,
	field_id integer NULL references batch ,
	value ... )
с уникальным ключом (variable_id ,batch_id, field_id ), на который и ссылается action_variable. Такая таблица может хранить значения одной и той же переменной, с разными сигнатурами(variable_id), (variable_id ,batch_id ), (variable_id ,batch_id, field_id ). Variable_definition - словарная таблица, минимально содержит имя и тип значения переменной, можно дополнить словарь переменных ограничениями на сигнатуры.
...
Рейтинг: 0 / 0
Научите как сделать это правильно
    #33079739
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сорри
Код: plaintext
1.
2.
3.
4.
CREATE TABLE variable_value ( 
	variable_id integer NOT NULL references variable_definition,
	batch_id integer NULL references batch ,
	field_id integer NULL references field_definition,
	value ... )
...
Рейтинг: 0 / 0
Научите как сделать это правильно
    #33082190
Решение пришло само собой, по сути - предложенное ModelR.
Всем ответившим - спасибо.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Научите как сделать это правильно
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]