Список вопросов
Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
894
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
913
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4350
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Организация системы ревизий в базе данных?
Просмотров: 347
 
Ответов: 1
Дано:
- Приложение, написанное на PHP с MySQL (Yii Framework);
- Несколько типов контента, например setting и node. Хранится в разных таблицах со своим набором полей;
- Около 10к пользователей приложения с очень частым обновлением одного из типов контента, допустим node. Во время редактирования node может обновляться до нескольких раз в секунду (с созданием новых ревизий). В тоже время, некоторые node могут не обновляться месяцами, а некоторые каждый день по нескольку раз.
Необходимо сделать что-то вроде системы контроля версий, чтобы синхронизировать несколько клиентских приложений с сервером. Хороший пример: расширение для браузеров Xmarks.
Вопрос заключается в том, как хранить ревизии (и изменения в них) в базе MySQL?
Мне на ум пришло такое решение:
Одна таблица, которая хранит все изменения контента. Выглядит это примерно так:
rev action type id args
1 insert node 1421 { text: 'custom node', created: 1236124121 }
2 update node 1421 { text: 'asd', modified: 1237123134 }
3 update node 1421 { title: 'example node', modified: 1238123814 }
3 insert node 1422 { field: new_value }
3 update setting 12 { email: 'Oo@mail.ru' }
4 update node 1422 { field: new_new_value }
4 update setting 12 { email: 'mail@mail.ru' }
5 delete node 1421 {}
- Rev – номер ревизии пользователя. В рамках одной ревизии может быть несколько записей.
- Action – тип изменений. insert|update|delete.
- Type – тип контента. Например, node или setting.
- Id – идентификатор контента.
- Args – объект json с логом изменений.
Не знаю, насколько правильно хранить ревизии таким образом, в одной таблице. Допустим, у каждого юзера будет по 5к ревизий – это уже 50 млн. записей! Как с этим будет справляться MySQL, если учесть, что идет постоянная запись в таблицу?
Как можно решить данную проблему наиболее рационально? Готов рассмотреть варианты с использованием других БД, в т.ч. NoSQL.
Большое спасибо за помощь.
UPD:
Есть вариант отказаться от возможности восстановить старые ревизии. Таким образом, можно исключить update записи и хранить только последнюю ревизию в таблице контента.
Тогда таблица сократиться в 10 раз, и в ней будет около 5 млн. записей. Насколько это упрощает задачу? Как поведет себя MySQL в таком случае?
Если есть возможность отказа от восстановления старых ревизий, то можно хранить скажем последних N-штук. Если так пугает число записей в БД, то почему не сделать в Вашей таблице другой тип связи, у Вас сейчас один ко многим, а сделать один к одному (по id), а всю историю изменений писать в args, с указанием action, уже непосредственно в args. Тут правда надо помнить о том, что длина полей тоже не бесконечна, и все вероятно не влезет.
Второй вариант — действительно, использовать NoSQL БД, например CouchDb ну или что-нибудь подобное, я думаю, что это будет даже самый правильный вариант.
Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться