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

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

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

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

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

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

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

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

отдельная таблица кастомизированных вариантов с кластерным по пользователю.
и юнион при выборках.
...
Рейтинг: 0 / 0
14.09.2011, 13:09
    #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
14.09.2011, 13:14
    #37439861
iljy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Локальная модификация
Dimitry SibiryakoviljyЯ бы добавил в ключ объекта идентификатор модифицировавшего пользователя и признак
существования записи и создал вьюху

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

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

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

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

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

Поэтому я и сказал, что существует вероятность. А связи можно установить на общую таблицу объектов, и таблицу с пользовательской инфой к ней же привязать.
...
Рейтинг: 0 / 0
14.09.2011, 19:48
    #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
15.09.2011, 00:23
    #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
15.09.2011, 01:52
    #37440983
SERG1257
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Локальная модификация
То есть у вас по любому есть
1 список оригинальных объектов
2 список модифицированных объектов видимых пользователю, но невидимых другим
3 список удаленных объектов невидимых пользователю, но видимых другим

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

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

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

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

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


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