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

Есть таблица объектов в которой хранятся некие свойства этих объектов: objects(id, a, b, c ,d .. z)
В таблице 1М записей.

С таблицей работают 10К пользователей. Каждый пользователь может произвольно редактировать любые свойства объектов. Однако, эти изменения должны быть локальны. Т.е. каждый пользователь должен видеть (делать выборки и т.д.) только свои изменения + все не измененные объекты - так сказать copy on write.
Реально, пользователь может модифицировать до 1К записей, вряд ли больше.

Как это лучше организовать? Предполагаю, что эта задача вполне типичная. Наверное есть какой-то шаблон решения для такой задачи.
...
Рейтинг: 0 / 0
Локальная модификация
    #37439216
Алекс56
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Забыл сказать, пользователь может удалять любые записи. Рзумеется, записи удаляются только в "представлении" конкретного пользователя.
...
Рейтинг: 0 / 0
Локальная модификация
    #37439217
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Правильно ли я понимаю что остальные видят (читают но не могут изменить) версию до изменений пользователем, а по завершении (commit) работы локальная копия становится доступной остальным?
...
Рейтинг: 0 / 0
Локальная модификация
    #37439246
Алекс56
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SERG1257Правильно ли я понимаю что остальные видят (читают но не могут изменить) версию до изменений пользователем, а по завершении (commit) работы локальная копия становится доступной остальным?

Нет, не так. Каждый пользователь должен видеть только свои изменения.
Скажем, пользователь поменял объект с id=12345. Он видит измененную версию, все остальные видят оригинальную.

Или, например, два пользователя модифицировали (по разному) объект с id=12345 - каждый видит свою версию. Остальные видят оригинальную версию.
...
Рейтинг: 0 / 0
Локальная модификация
    #37439404
iljy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алекс56,

задача не особо типичная. Я бы добавил в ключ объекта идентификатор модифицировавшего пользователя и признак существования записи и создал вьюху вида
Код: plaintext
1.
2.
SELECT все, кромя ИД пользователя
FROM Таблица_С_ИД_Пользователя
WHERE ИД_Пользователя is null or ИД_Пользователя = SUSER_ID() and Существует =  1 
и повесил на нее триггеры на изменение.
...
Рейтинг: 0 / 0
Локальная модификация
    #37439711
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iljyЯ бы добавил в ключ объекта идентификатор модифицировавшего пользователя и признак
существования записи и создал вьюху

А я бы дал каждому пользователю отдельную базу и твори он там что в голову взбредёт.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Локальная модификация
    #37439777
Алекс56,

отдельная таблица кастомизированных вариантов с кластерным по пользователю.
и юнион при выборках.
...
Рейтинг: 0 / 0
Локальная модификация
    #37439849
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алекс56Т.е. каждый пользователь должен видеть (делать выборки и т.д.) только свои изменения + все не измененные объекты
Что является единицей "изменения" - объект или поле?

К примеру, был объект (id = 1, a = 1, b = 1).
Пользователь 1 его изменил: (id = 1, a = 2, b = 1).
После этого в "таблице объектов" объект изменили на (id = 1, a = 1, b = 2).

Какую запись должен увидеть Пользователь 1? Пользователь 2?
...
Рейтинг: 0 / 0
Локальная модификация
    #37439861
iljy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakoviljyЯ бы добавил в ключ объекта идентификатор модифицировавшего пользователя и признак
существования записи и создал вьюху

А я бы дал каждому пользователю отдельную базу и твори он там что в голову взбредёт.

10К баз?? Плохое решение, даже если сервер позволит столько подключить. Их же надо администрировать как минимум. И к тому же - это полное дублирование записей, а их миллион, на 10К баз получается 10 миллиардов! А еще - нигде не сказано, что этими объектами дело ограничивается, остальное тоже дублировать будем? Или межбазовые связи настраивать и целостность контроллировать?
...
Рейтинг: 0 / 0
Локальная модификация
    #37439874
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iljyИли межбазовые связи настраивать и целостность контроллировать?
Зачем контролировать? По ТЗ пользователь не должен видеть никакие изменения в базе кроме
своих.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Локальная модификация
    #37439912
iljy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakoviljyИли межбазовые связи настраивать и целостность контроллировать?
Зачем контролировать? По ТЗ пользователь не должен видеть никакие изменения в базе кроме
своих.

А кто вам сказал, что эта таблица с объектами в базе единственная? ТС не говорил, так что есть хорошая (я бы сказал примерно 112%-114% ;) ) вероятность, что в базе есть много чего еще, и это много чего с этими объектами как-то связано. Да и с единственной таблицей я так делать не стал : на 10 миллиардов записей никакие кешей не напасешься и тормозить все это будет сказочно.
А чем вас не устраивает вьюха? Существуют стандартные решения по Row-Level Security, так что доступ разделить не проблема, производительность при такой реализации тоже несложно контроллировать. Можно сделать 2 таблицы, в одной держать общие записи, в другой - модифицированные, это работу с индексами упростит.
...
Рейтинг: 0 / 0
Локальная модификация
    #37440051
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iljyА кто вам сказал, что эта таблица с объектами в базе единственная? ТС не говорил

Однако, он не говорил и обратного. Если в базе и есть какая-то другая информация, то связи
между ней и данной таблицей будут... довольно забавными.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Локальная модификация
    #37440094
iljy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakoviljyА кто вам сказал, что эта таблица с объектами в базе единственная? ТС не говорил

Однако, он не говорил и обратного. Если в базе и есть какая-то другая информация, то связи
между ней и данной таблицей будут... довольно забавными.

Поэтому я и сказал, что существует вероятность. А связи можно установить на общую таблицу объектов, и таблицу с пользовательской инфой к ней же привязать.
...
Рейтинг: 0 / 0
Локальная модификация
    #37440702
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторНет, не так. Каждый пользователь должен видеть только свои изменения.То есть синхронизация изменений отсутствует как классА?

Решение задачи в лоб (схематично)
Код: 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.
create table obj (id int primary key, data_fields varchar( 10 ))

create table obj_ver (id int, data_fields varchar( 10 ),isDeleted bit, usr varchar( 10 ) primary key (usr,id))

create view vw_obj as 
select id, data_fields from obj o
 where not exists (select * from obj_ver v where o.id=v.id and v.usr=system_user)
union all
select id, data_fields from obj_ver 
 where isDeleted <> 1 

create trigger instead_of_del on vw_obj
begin
  insert into obj_ver (id, data_fields, isDeleted, usr) 
  select id, data_fields,  1 , system_user from deleted
end

create trigger instead_of_upd on vw_obj
begin
  if not exists (select * from obj_ver where id=deleted.id  and usr=system_user)
     insert into obj_ver (id, data_fields, isDeleted, usr) 
     select id, data_fields,  0 , system_user from deleted
  else 
     update obj_ver set data_fields=deleted.data_fields where id=deleted.id  and usr=system_user
end

create trigger instead_of_ins on vw_obj
begin
     insert into obj_ver (id, data_fields, isDeleted, usr) 
     select new_id_gen_function, data_fields,  0 , system_user from inserted
end

Разумеется имя пользователя можно/нужно нормализовать заменив на usr_id, на эту таблицу (вьюху) нельзя будет ссылаться, и новый id для таблицы с версиями не должен пересекаться со старым.
...
Рейтинг: 0 / 0
Локальная модификация
    #37440953
Алекс56
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за отзывы.
Весьма интересно, подумаю над тригерами.

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

У меня есть вариант решения, но мне кажется он несколько громоздким:
1. Таблицу obj расширить: obj(obj_id, orig_obj_id, user_id ...), где
obj_id - собственно id объекта;
orig_obj_id - id оригинала;
user_id - пользователь изменивший объект


2. Создается сопутствующая таблица т.с. скрытых объектов: obj_hidden(obj_id, user_id)
Здесь хранятся obj_id скрытых для данного пользователя объектов.


Для оригинальных объектов в obj.orig_obj_id=null и obj.user_id=null. В случае модификации объекта создается копия. Соответственно, в копии obj.orig_obj_id указывает на оригинал, obj.user_id указывает на пользователя которому принадлежит локальная копия. В таблицу obj_hidden заносится obj_id оригинала.

При удалении пользователем объекта в таблицу obj_hidden просто заносится obj_id. Если пользователь удаляет свой модифицированный объект, в эту таблицу наносится orig_obj_id, а его локальная копия удаляется физически.

Таким образом, выборка obj для пользователя делается по условиям:
obj.user_id=null И obj.obj_id отсутствует в obj_hidden
ИЛИ
obj.user_id=USER

Теоретически, это вроде бы должно работать, но мне кажется, как-то можно упростить.
...
Рейтинг: 0 / 0
Локальная модификация
    #37440983
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То есть у вас по любому есть
1 список оригинальных объектов
2 список модифицированных объектов видимых пользователю, но невидимых другим
3 список удаленных объектов невидимых пользователю, но видимых другим

в какие таблицы вы их засунете это вопрос реализации - вы предложили объединить списки 1 и 2, я предложил объединить списки 2 и 3.
...
Рейтинг: 0 / 0
Локальная модификация
    #37440991
Алекс56
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SERG1257То есть у вас по любому есть
в какие таблицы вы их засунете это вопрос реализации - вы предложили объединить списки 1 и 2, я предложил объединить списки 2 и 3.

Да, действительно.
Осталось еще view для пользователя оптимально сделать.
Интересно, с точки зрения производительности, какие списки лучше объединить, 1-2 или 2-3.
...
Рейтинг: 0 / 0
Локальная модификация
    #37440999
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алекс56 Интересно, с точки зрения производительности, какие списки лучше объединить, 1-2 или 2-3. Или вообще ничего не объединять. Просто создайте разные таблицы заполните их реальными данными и прогоните ваши запросы, подсчитав количество логических чтений.
...
Рейтинг: 0 / 0
Локальная модификация
    #37442990
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алекс56,

т.е. мы говорим об истории изменений в разрезе пользователя просто? и все?
...
Рейтинг: 0 / 0
Локальная модификация
    #37443962
Алекс56
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ОзверинАлекс56,

т.е. мы говорим об истории изменений в разрезе пользователя просто? и все?

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


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