powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Версионность (хранение истории) многие-ко-многим
1 сообщений из 1, страница 1 из 1
Версионность (хранение истории) многие-ко-многим
    #35874766
pil0t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите как организовать версионность отношения многие-ко-многим
Ситуация такая:
таблица документов отражающая Документ
"Табличная часть" документа - таблица со ссылкой на документ (поле idOwner)
Связь многие ко многим между Документом и LinkTable.

Документ изменяется операциями.
После выполнения операции новый документ записывается в таблицу истории с указанием операции, времени выполнения, и новыми значениями полей документа.

Теперь операция может изменять не только поля документа, но и Табличную часть и связь многие-ко-многим. И их тоже нужно хранить в истории.
Хочется получать состояние документа на определенный момент (выполнение части операций над ним)

Есть варианты:
1. Для каждой версии делать "Снимок" Табличной части и Таблицы связи м-к-м, с указанием версии (например id из DocumentHistory)
+ легко строить запросы
- при росте количества операций - сильно растет занимаемое место
2. Создать таблицу истории Табличной части и таблицы связи м-к-м, в которой хранится диапазон актуальности значений.
Вот тут и возникла сложность.
Если указывать промежуток с помощью uniqueidentifier - то получится слишком сложно строить запросы
как бы их так легко указать?


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
-- Таблица документа
CREATE TABLE [dbo].[Document] (
  [id] uniqueidentifier NOT NULL,
  [timestamp] timestamp NULL,
  [Name] nvarchar(max) COLLATE Cyrillic_General_CI_AS NULL,
  [Description] nvarchar(max) COLLATE Cyrillic_General_CI_AS NULL,
  PRIMARY KEY CLUSTERED ([id])
)

-- Табличная часть документа
CREATE TABLE [dbo].[TablePart] (
  [id] uniqueidentifier NOT NULL,
  [idOwner] uniqueidentifier NOT NULL, -- Ссылка на документ
  [Name] nvarchar(max) COLLATE Cyrillic_General_CI_AS NULL,
  PRIMARY KEY CLUSTERED ([id]),
  CONSTRAINT [TablePart_fk] FOREIGN KEY ([idOwner]) 
  REFERENCES [dbo].[Document] ([id]) 
  ON UPDATE NO ACTION
  ON DELETE CASCADE
)


-- Операции которые можно производить над документом
CREATE TABLE [dbo].[Operations] (
  [id] uniqueidentifier NOT NULL,
  [Name] nvarchar(max) COLLATE Cyrillic_General_CI_AS NULL,
  CONSTRAINT [Operations_pk] PRIMARY KEY CLUSTERED ([id])
)

-- История изменения документов
CREATE TABLE [dbo].[DocumentHistory] (
  [id] uniqueidentifier NOT NULL,
  [documentId] uniqueidentifier NULL,
  [operationId] uniqueidentifier NULL,
  [operationTime] datetime NULL,
  [timestamp] timestamp NULL,
  [Name] nvarchar(max) COLLATE Cyrillic_General_CI_AS NULL,
  [Description] nvarchar(max) COLLATE Cyrillic_General_CI_AS NULL,
  PRIMARY KEY CLUSTERED ([id]),
  CONSTRAINT [DocumentHistory_fk] FOREIGN KEY ([documentId]) 
  REFERENCES [dbo].[Document] ([id]) 
  ON UPDATE NO ACTION
  ON DELETE CASCADE,
  CONSTRAINT [DocumentHistory_fk2] FOREIGN KEY ([operationId]) 
  REFERENCES [dbo].[Operations] ([id]) 
  ON UPDATE NO ACTION
  ON DELETE NO ACTION
)


-- Какая-то ещё таблица, на которую возможны ссылки "многое-ко-многим" из Документа
CREATE TABLE [dbo].[LinkTable] (
  [id] uniqueidentifier NOT NULL,
  [Name] nvarchar(max) COLLATE Cyrillic_General_CI_AS NULL,
  CONSTRAINT [LinkTable_pk] PRIMARY KEY CLUSTERED ([id])
)

-- Связь многие ко многим
CREATE TABLE [dbo].[MultLink] (
  [idDocument] uniqueidentifier NOT NULL,
  [idLink] uniqueidentifier NOT NULL,
  PRIMARY KEY CLUSTERED ([idDocument], [idLink]),
  CONSTRAINT [MultLink_fk] FOREIGN KEY ([idDocument]) 
  REFERENCES [dbo].[Document] ([id]) 
  ON UPDATE NO ACTION
  ON DELETE NO ACTION,
  CONSTRAINT [MultLink_fk2] FOREIGN KEY ([idLink]) 
  REFERENCES [dbo].[LinkTable] ([id]) 
  ON UPDATE NO ACTION
  ON DELETE NO ACTION
)


Модератор: Тема перенесена из форума "Microsoft SQL Server".
...
Рейтинг: 0 / 0
1 сообщений из 1, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Версионность (хранение истории) многие-ко-многим
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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