Notes |
|
(0016579)
|
sheavy
|
16-10-2015 15:59
|
|
начало здесь: http://www.sasgis.org/mantis/view.php?id=2857 |
|
|
(0016581)
|
zed
|
18-10-2015 06:13
|
|
Да, нужно делать insert вместо update, если метка удалена. При этом id у метки изменится и вероятно из гуя можно будет отследить этот момент и сообщить юзеру, что метка была вставлена, а не изменена. |
|
|
(0016582)
|
zed
|
18-10-2015 12:25
(edited on: 18-10-2015 12:26) |
|
Ха, интересная вещь получается. Если пользователь удалит и поставит новую метку за то время, пока первый редактирует, то добавленная метка затрётся если делать проверку существования метки по id. Дело в том, что поле id не автоинкрементное и при вставке вычисляется как "select max(id) from %table_name%". Поэтому, чтобы корректно определить не удалилась ли метка из БД, для метки нужно сохранять ещё и её хэш и проверять, что в БД есть такой id с таким-то хэшем.
А из этого следует, что надо обновлять модель и гораздо серьёзнее рефакторить код, чтобы пофиксить данный тикет.
Или может у кого есть предложение, как это можно сделать проще?
|
|
|
(0016584)
|
zed
|
18-10-2015 16:46
|
|
И если добавлять в модель поле с хэшем, то не понятно что делать со старыми записями в БД. В общем, беда... |
|
|
|
> Дело в том, что поле id не автоинкрементное и при вставке вычисляется как "select max(id) from %table_name%".
Это очень плохо. В многопользовательской системе это практически недопустимо. |
|
|
(0016586)
|
zed
|
18-10-2015 19:50
|
|
Это делается внутри транзакции, так что особого криминала быть не должно - инсерт просто обломится, если кто-то успеет вставить строку с таким же id. |
|
|
|
Ну вот вариант редактирования и пересоздания метки отличный контрпример, почему так делать не стоит. А вообще для таких вещей ИМХО оптимальный вариант это использование каких-то GUID в качестве ID. Шансов на дубль почти нету, а при размере полигона хотя бы в 10 точек накладные расходы на GUID выглядят копейками. Да и генерить можно ключи без обращения к серверу. |
|
|
(0016590)
|
zed
|
19-10-2015 08:42
(edited on: 19-10-2015 08:52) |
|
Ну так это делает фреймворк и там есть на то причины. Просто я его использую не совсем так, как это задумывали его создатели. Если следовать рекомендациям, то СУБД и MongoDB из SAS нужно выпилить, потому как эти фишки не рекомендуют использовать из клиентского приложения.
По поводу guid - предлагаешь добавить текстовое поле?
|
|
|
(0016591)
|
zed
|
19-10-2015 08:51
|
|
И что делать с существующими записями в БД у которых этого поля нет? |
|
|
|
> По поводу guid - предлагаешь добавить текстовое поле?
Ну, не то что бы предлагаю делать, а предлагаю рассмотреть такой вариант.
+ версия для записи
+ все операции делать в режиме CompareAndSwap (CAS)
+ добавить поддержку CAS режима в интерфейсы баз меток САСа и его ГУЙ.
Причем раз уж у нас уже есть несколько движков для меток, то никто не заставляет ломать совместимость уже существующих локальных баз. Пусть SQLite и тп живет с той схемой что есть, а серверные СУБД можно потихоньку пилить новую схему в виде отдельного типа баз. |
|
|
|
>И что делать с существующими записями в БД у которых этого поля нет?
В локальных базах оно не особо нужно.
А серверные таки придется обновлять схему, но ИМХО тот кто настроил сервер сможет и обновить структуру его таблиц. |
|
|
(0016594)
|
zed
|
19-10-2015 09:12
(edited on: 19-10-2015 09:13) |
|
>предлагаю рассмотреть такой вариант.
Рассматривать варианты можно когда их предложено несколько. А тут как бы и выбирать не из чего? Можно ещё предложить решение "в лоб": перед инсертом заново считывать все данные из БД и проверять со старой записью в памяти, и если не совпадает хоть одно поле, запрещать обновление. Это тоже самое, что и вариант с версией и guid, но из БД нужно будет считывать гораздо больше. Зато обновлять схему не потребуется.
>сможет и обновить структуру его таблиц
Структуру таблиц движок сам обновит, не в этом вопрос. Но вот после обновления, новые поля нужно будет чем-то заполнить. Предлагаешь заставить всех руками их заполнять?
|
|
|
|
> Рассматривать варианты можно когда их предложено несколько.
Подразумевается, что у тебя есть свои мысли и идеи на этот счет. Ты же начал реализацию меток на базе СУБД, должен был уже что-то попробовать, знаешь как ORM работает.
>заново считывать все данные из БД и проверять со старой записью в памяти, и если не совпадает хоть одно поле, запрещать обновление.
Тоже вполне себе вариант. Но я бы все равно посоветовал разделять локальные базы и серверные СУБД на разные типы базы меток.
>Структуру таблиц движок сам обновит, не в этом вопрос. Но вот после обновления, новые поля нужно будет чем-то заполнить.
Ну, гуид прекрасно делается из существующих ID, а версия просто устанавливается в 1 или в любое ненулевое число, хоть рендомное. |
|
|
(0016596)
|
zed
|
19-10-2015 10:22
|
|
> должен был уже что-то попробовать, знаешь как ORM работает.
Святая наивность :) Ты может забыл - я не программист и образование у меня не it-шное. Моё знакомство с СУБД и ORM происходит у тебя на глазах, в коде SAS. А до этого я точно так же знакомился с Беркли и со всеми прочими штуками.
> Но я бы все равно посоветовал разделять локальные базы и серверные СУБД на разные типы базы меток.
Как ты это представляешь? Уйти от ORM и сделать СУБД нативно?
В общем, наверное сделаю решение "в лоб" для СУБД и монги, без изменения схемы. Оно хоть и не оптимально будет с точки зрения производительности, но операция редактирования на самом деле должна быть весьма редкая. А с SQLite3 прокатит простая проверка id, т.к. там он таки автоинкрементный. |
|
|
|
>> должен был уже что-то попробовать, знаешь как ORM работает.
> Святая наивность :) Ты может забыл - я не программист и образование у меня не it-шное. Моё знакомство с СУБД и ORM происходит у тебя на глазах, в коде SAS. А до этого я точно так же знакомился с Беркли и со всеми прочими штуками.
Ты думаешь, я наю намного больше в этой области?
>> Но я бы все равно посоветовал разделять локальные базы и серверные СУБД на разные типы базы меток.
>Как ты это представляешь? Уйти от ORM и сделать СУБД нативно?
Разделить реализацию на уровне делфийского кода. Так как сейчас различаются SML и SQLite. После чего считать базы в формате SQLite уже стабильным форматом, а метки в СУБД допиливать никому не обещая их совместимость. |
|
|
(0016600)
|
zed
|
19-10-2015 13:19
|
|
Сейчас есть SML и ORM, а не SQLite. А чтобы на уровне кода разнести SQLite и СУБД, придётся тупо копипастить и делить ORM пополам. В итоге, получится ORM который только SQLite и ORM, который всё остальное. И там будет до 90% одинакового кода. Ты это предлагаешь? |
|
|
|
Не важно как это в коде будет выглядить. Пока можно ограничиться булевым параметром в конструкторе фабрики баз меток. Главное что бы пользовтель явно видел, что это локальная база меток, а это подключение к серверу, которое пока работает в тестовом режиме и может понадобиться или грохнуть всю базу, или вручную ее модифицировать при изменении структуры. |
|