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

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

В первом случае необходимо использовать подзапрос на поиск максимальной даты
и потом повторное соединение.

Во втором случае ограничивая по двум датам можно найти запись на требуемую дату
но, при вставке новой даты необходимо обновлять предыдущую строку.
При этом возникают проблемы, когда date_on начинают редактировать.

Посоветуйте, может есть болие оптимальные структуры?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
--Структура 1:
create table CUSTOMERS (
	cust_id int			-- Код сотрудника
,	name varchar ( 128 )	-- Имя сотрудника
)

create table CUST_DEPTS (
	id int
,	dept_id int			-- Код отдела
,	cust_id int			-- Код сотрудника
,	date_on datetime	-- Дата
,	constraint PK_CUST_DEPTS primary key (id)
)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
-- Структура 2:
create table CUSTOMERS (
	cust_id int			-- Код сотрудника
,	name varchar ( 128 )	-- Имя сотрудника
)

create table CUST_DEPTS (
	dept_id int			-- Код отдела
,	cust_id int			-- Код сотрудника
,	date_on datetime	-- Дата начала действия
,	date_off datetime	-- Дата окончания действия
,	constraint PK_CUST_DEPTS primary key (cust_id, date_on desc)
)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
При этом в первом случае зпрос примерно будет такой:
select c.*, cd.dept_id
from CUSTOMERS c
	inner join (
		select max (id) id, cust_id 
		from CUST_DEPTS 
		where date_on <= @date -- дата ограничения
		group by cust_id
	) cdg on cdg.cust_id = c.cust_id
	inner join CUST_DEPTS cd on cd.id = cdg.id

Код: plaintext
1.
2.
3.
4.
5.
6.
Во втором случае запрос примерно такой:
select c.*, cd.dept_id
from CUSTOMERS c
	inner join CUST_DEPTS cd on cd.cust_id = c.cust_id
where cd.date_on <= @date 
	and (cd.date_off is null or cd.date_off > @date)
...
Рейтинг: 0 / 0
Прошу совета по структуре таблиц
    #35140182
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Второй вариант с date_on, date_off определённо предпочтительнее. Ведь данные ты заливаешь один раз, а пользуешься многократно.

Что касается корректировок, то имеет смысл отделить историческую БД от оперативной БД. Т.е. в оперативной БД хранить что то типа приказов о переводе сотрудника из отдела в отдел. Ясное дело, приказ имеет только одну дату, которую при необходимости не сложно исправить. А затем автоматической процедурой перегружать данные из оперативной БД в историческую. В процессе перегрузки не сложно вычислить date_off. Только учти, что перегружать нужно не только сами приказы, но и данные о сотрудниках и отделах. Инача при удалении отдела из оперативной БД, твоя историческая БД потеряет сведения. Короче, это обычный DWH.
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Прошу совета по структуре таблиц
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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