|
|
|
Локальная модификация
|
|||
|---|---|---|---|
|
#18+
Помогите решить задачу. Есть таблица объектов в которой хранятся некие свойства этих объектов: objects(id, a, b, c ,d .. z) В таблице 1М записей. С таблицей работают 10К пользователей. Каждый пользователь может произвольно редактировать любые свойства объектов. Однако, эти изменения должны быть локальны. Т.е. каждый пользователь должен видеть (делать выборки и т.д.) только свои изменения + все не измененные объекты - так сказать copy on write. Реально, пользователь может модифицировать до 1К записей, вряд ли больше. Как это лучше организовать? Предполагаю, что эта задача вполне типичная. Наверное есть какой-то шаблон решения для такой задачи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.09.2011, 02:29 |
|
||
|
Локальная модификация
|
|||
|---|---|---|---|
|
#18+
Забыл сказать, пользователь может удалять любые записи. Рзумеется, записи удаляются только в "представлении" конкретного пользователя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.09.2011, 02:36 |
|
||
|
Локальная модификация
|
|||
|---|---|---|---|
|
#18+
Правильно ли я понимаю что остальные видят (читают но не могут изменить) версию до изменений пользователем, а по завершении (commit) работы локальная копия становится доступной остальным? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.09.2011, 02:41 |
|
||
|
Локальная модификация
|
|||
|---|---|---|---|
|
#18+
SERG1257Правильно ли я понимаю что остальные видят (читают но не могут изменить) версию до изменений пользователем, а по завершении (commit) работы локальная копия становится доступной остальным? Нет, не так. Каждый пользователь должен видеть только свои изменения. Скажем, пользователь поменял объект с id=12345. Он видит измененную версию, все остальные видят оригинальную. Или, например, два пользователя модифицировали (по разному) объект с id=12345 - каждый видит свою версию. Остальные видят оригинальную версию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.09.2011, 04:33 |
|
||
|
Локальная модификация
|
|||
|---|---|---|---|
|
#18+
Алекс56, задача не особо типичная. Я бы добавил в ключ объекта идентификатор модифицировавшего пользователя и признак существования записи и создал вьюху вида Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.09.2011, 09:47 |
|
||
|
Локальная модификация
|
|||
|---|---|---|---|
|
#18+
iljyЯ бы добавил в ключ объекта идентификатор модифицировавшего пользователя и признак существования записи и создал вьюху А я бы дал каждому пользователю отдельную базу и твори он там что в голову взбредёт. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.09.2011, 12:16 |
|
||
|
Локальная модификация
|
|||
|---|---|---|---|
|
#18+
Алекс56, отдельная таблица кастомизированных вариантов с кластерным по пользователю. и юнион при выборках. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.09.2011, 12:42 |
|
||
|
Локальная модификация
|
|||
|---|---|---|---|
|
#18+
Алекс56Т.е. каждый пользователь должен видеть (делать выборки и т.д.) только свои изменения + все не измененные объекты Что является единицей "изменения" - объект или поле? К примеру, был объект (id = 1, a = 1, b = 1). Пользователь 1 его изменил: (id = 1, a = 2, b = 1). После этого в "таблице объектов" объект изменили на (id = 1, a = 1, b = 2). Какую запись должен увидеть Пользователь 1? Пользователь 2? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.09.2011, 13:09 |
|
||
|
Локальная модификация
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakoviljyЯ бы добавил в ключ объекта идентификатор модифицировавшего пользователя и признак существования записи и создал вьюху А я бы дал каждому пользователю отдельную базу и твори он там что в голову взбредёт. 10К баз?? Плохое решение, даже если сервер позволит столько подключить. Их же надо администрировать как минимум. И к тому же - это полное дублирование записей, а их миллион, на 10К баз получается 10 миллиардов! А еще - нигде не сказано, что этими объектами дело ограничивается, остальное тоже дублировать будем? Или межбазовые связи настраивать и целостность контроллировать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.09.2011, 13:14 |
|
||
|
Локальная модификация
|
|||
|---|---|---|---|
|
#18+
iljyИли межбазовые связи настраивать и целостность контроллировать? Зачем контролировать? По ТЗ пользователь не должен видеть никакие изменения в базе кроме своих. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.09.2011, 13:19 |
|
||
|
Локальная модификация
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakoviljyИли межбазовые связи настраивать и целостность контроллировать? Зачем контролировать? По ТЗ пользователь не должен видеть никакие изменения в базе кроме своих. А кто вам сказал, что эта таблица с объектами в базе единственная? ТС не говорил, так что есть хорошая (я бы сказал примерно 112%-114% ;) ) вероятность, что в базе есть много чего еще, и это много чего с этими объектами как-то связано. Да и с единственной таблицей я так делать не стал : на 10 миллиардов записей никакие кешей не напасешься и тормозить все это будет сказочно. А чем вас не устраивает вьюха? Существуют стандартные решения по Row-Level Security, так что доступ разделить не проблема, производительность при такой реализации тоже несложно контроллировать. Можно сделать 2 таблицы, в одной держать общие записи, в другой - модифицированные, это работу с индексами упростит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.09.2011, 13:29 |
|
||
|
Локальная модификация
|
|||
|---|---|---|---|
|
#18+
iljyА кто вам сказал, что эта таблица с объектами в базе единственная? ТС не говорил Однако, он не говорил и обратного. Если в базе и есть какая-то другая информация, то связи между ней и данной таблицей будут... довольно забавными. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.09.2011, 14:18 |
|
||
|
Локальная модификация
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakoviljyА кто вам сказал, что эта таблица с объектами в базе единственная? ТС не говорил Однако, он не говорил и обратного. Если в базе и есть какая-то другая информация, то связи между ней и данной таблицей будут... довольно забавными. Поэтому я и сказал, что существует вероятность. А связи можно установить на общую таблицу объектов, и таблицу с пользовательской инфой к ней же привязать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.09.2011, 14:36 |
|
||
|
Локальная модификация
|
|||
|---|---|---|---|
|
#18+
авторНет, не так. Каждый пользователь должен видеть только свои изменения.То есть синхронизация изменений отсутствует как классА? Решение задачи в лоб (схематично) Код: 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. Разумеется имя пользователя можно/нужно нормализовать заменив на usr_id, на эту таблицу (вьюху) нельзя будет ссылаться, и новый id для таблицы с версиями не должен пересекаться со старым. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.09.2011, 19:48 |
|
||
|
Локальная модификация
|
|||
|---|---|---|---|
|
#18+
Спасибо за отзывы. Весьма интересно, подумаю над тригерами. Таблица, действительно, не единственная и есть связи с другими таблицами. Конечно, создавать отдельную таблицу для каждого пользователя избыточно. Хотелось бы найти красивое решение :) У меня есть вариант решения, но мне кажется он несколько громоздким: 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 Теоретически, это вроде бы должно работать, но мне кажется, как-то можно упростить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2011, 00:23 |
|
||
|
Локальная модификация
|
|||
|---|---|---|---|
|
#18+
То есть у вас по любому есть 1 список оригинальных объектов 2 список модифицированных объектов видимых пользователю, но невидимых другим 3 список удаленных объектов невидимых пользователю, но видимых другим в какие таблицы вы их засунете это вопрос реализации - вы предложили объединить списки 1 и 2, я предложил объединить списки 2 и 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2011, 01:52 |
|
||
|
Локальная модификация
|
|||
|---|---|---|---|
|
#18+
SERG1257То есть у вас по любому есть в какие таблицы вы их засунете это вопрос реализации - вы предложили объединить списки 1 и 2, я предложил объединить списки 2 и 3. Да, действительно. Осталось еще view для пользователя оптимально сделать. Интересно, с точки зрения производительности, какие списки лучше объединить, 1-2 или 2-3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2011, 02:21 |
|
||
|
Локальная модификация
|
|||
|---|---|---|---|
|
#18+
Алекс56 Интересно, с точки зрения производительности, какие списки лучше объединить, 1-2 или 2-3. Или вообще ничего не объединять. Просто создайте разные таблицы заполните их реальными данными и прогоните ваши запросы, подсчитав количество логических чтений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2011, 02:56 |
|
||
|
Локальная модификация
|
|||
|---|---|---|---|
|
#18+
Алекс56, т.е. мы говорим об истории изменений в разрезе пользователя просто? и все? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2011, 10:12 |
|
||
|
Локальная модификация
|
|||
|---|---|---|---|
|
#18+
ОзверинАлекс56, т.е. мы говорим об истории изменений в разрезе пользователя просто? и все? Ну, это не совсем история изменений. Немного упрощая, каждый пользователь должен как бы иметь собственную таблицу и менять ее как хочет. Делать для каждого пользователя отдельную таблицу не представляется возможным. Суть задачи - создать иллюзию для пользователя, что он один работает с таблицей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2011, 16:54 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=37440983&tid=1542018]: |
0ms |
get settings: |
7ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
150ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
74ms |
get tp. blocked users: |
1ms |
| others: | 207ms |
| total: | 477ms |

| 0 / 0 |
