powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Правильная организация master-detail локальной работы с данными
44 сообщений из 44, показаны все 2 страниц
Правильная организация master-detail локальной работы с данными
    #39901047
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть документ, в котором есть список людей, а у каждого человека может быть несколько адресов. Вообщем обычная связь один ко многим. Было принято решение, что все действия с документом проходят на стороне клиента, а в базу все что наворочено записывается по кнопке сохранить.
Для этого использую два memtable связанных master-detail и выставленным свойством CachedUpdates=True.
memTable людей(mtPerson [id_document, id_person, fio], memTable адресов (mtAdr [id_person, ord, adres]
Все это дело отображается неплохо, но вот со вставкой новых данных мне не нравиться сама организация работы.

Если документ новый, то id_document=-1. Человек новый id_person=-1. Адрес новый id_adr=-1.

При сохранении документа, я получаю значение id_document(автоинкриментое поле). Потом перед сохранением списка людей пробегаю по memTable людей(mtPerson) и меняю id_document на вновь полученный.
Так как связь master-detail не допускает нескольких записей с id_person=-1, то мне пришлось вводить на форме суррогатный ключ id_p (при добавлении новой записи inc(id_p, -1) )

уже получается
mtPerson [id_document, id_person, fio, id_p]
mtAdr [id_person, ord, adres, id_p]

Потом при записи в БД данных mtPerson я получаю правильный id_person и пробегая по mtAdr сравниваю id_p и меняю id_person на правильный id_person а потом сохраняю в БД.

Потом при локальном удалении, редактировании записей в memTables куча проверок. Все это громозко и очень топорно.
Хотя задача стандартная.

Какие есть стандартные изящные решения?

TFDSchemaAdapter решает такие проблемы, но он подключается только к FDQuery, а мне нужны именно memTable.
...
Рейтинг: 0 / 0
Правильная организация master-detail локальной работы с данными
    #39901063
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Удалить список людей с адресами у документа и запостить новый.
...
Рейтинг: 0 / 0
Правильная организация master-detail локальной работы с данными
    #39901067
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBr, это не решает проблему получения правильных id_person для адресов
...
Рейтинг: 0 / 0
Правильная организация master-detail локальной работы с данными
    #39901074
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это решает проблемы всевозможных синхронизация данных которые были и которые появились/изменились/удалились
Вы загружаете на клиента список сотрудников с адресами обрабатываете его на клиенте и выгружаете обратно.

А от получения IdPerson никуда не уйти. Разве что хранить Адреса не в виде таблицы, а в виде текста в самой таблице сотрудников
...
Рейтинг: 0 / 0
Правильная организация master-detail локальной работы с данными
    #39901079
DesWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
cptngrb,

Может прикрутить к ID в MemTable генератор из базы, а в базе убрать автоинкремент?
...
Рейтинг: 0 / 0
Правильная организация master-detail локальной работы с данными
    #39901085
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrb
Если документ новый, то id_document=-1. Человек новый id_person=-1. Адрес новый id_adr=-1.

Почему-бы новым строкам не добавлять инкрементные отрицательные значения? -1, -2, -3 и т.д.
Тогда при записи будет понятно, что ид изменится и далее заменять и у зависимостей.
...
Рейтинг: 0 / 0
Правильная организация master-detail локальной работы с данными
    #39901090
Sinemurius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я прошу прощения, а Вы id человека, id адреса создаете в клиенте ?
А если два клиента одновременно будут документ создавать ?
Почему нельзя редактировать (и сохранять) каждый адрес отдельно ? То есть у Вас открыта информация о человеке. Вы нажимаете кнопку добавить адрес. Открывается формочка с параметрами адреса, которые Вы заполняете не забыв заполнить id человека. Нажимаете сохранить и очередной адрес записывается в базу данных.
...
Рейтинг: 0 / 0
Правильная организация master-detail локальной работы с данными
    #39901092
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrb
Все это громозко и очень топорно.
Хотя задача стандартная.

Какие есть стандартные изящные решения?


если под "стандартными" имеются в виду из коробки то никаких, раз уж даже FD не помогает

я лично делаю так - 11730884
...
Рейтинг: 0 / 0
Правильная организация master-detail локальной работы с данными
    #39901103
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman
я так и делаю inc(id_p, -1)
...
Рейтинг: 0 / 0
Правильная организация master-detail локальной работы с данными
    #39901104
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sinemurius, ид человека еще не известен, если человек тоже добавляется. его реальный id появиться, только после записи в БД
...
Рейтинг: 0 / 0
Правильная организация master-detail локальной работы с данными
    #39901105
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrb
я так и делаю inc(id_p, -1)

Это лишнее поле в моем представлении. Уже имеется id_person.
...
Рейтинг: 0 / 0
Правильная организация master-detail локальной работы с данными
    #39901108
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sinemurius, два клиента пускай одновременно создают, правильные id я беру при записи из базы через генератор, а он сам обеспечивает неповторяемость
...
Рейтинг: 0 / 0
Правильная организация master-detail локальной работы с данными
    #39901109
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman, согласен
...
Рейтинг: 0 / 0
Правильная организация master-detail локальной работы с данными
    #39901150
zeon11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrb,

Есть два способа, достаточно правильных, что-бы не нарваться на "грабли"
1. Перед формированием записи, заранее запрашиваете значение генератора с сервера,
и работаете с этим значением.
Некоторых этот способ пугает, - "а что, если запись не была создана, а значение генератора было использовано?". Тут уж на Ваше усмотрение.
2. На сервере создаете хранимую процедуру, в которую передаёте всё, что пожелаете.
В этой процедуре и делите данные на две таблицы. Из процедуры возвращаете ID новой записи, по которой и будете делать рефреш из клиента
...
Рейтинг: 0 / 0
Правильная организация master-detail локальной работы с данными
    #39901151
Sinemurius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторSinemurius, ид человека еще не известен, если человек тоже добавляется. его реальный id появиться, только после записи в БД
Так добавляйте адрес только тогда, когда человек в БД уже записан и у него есть ID человека.
То есть добавили человека, записали в БД. Добавили адрес, записали в БД.
...
Рейтинг: 0 / 0
Правильная организация master-detail локальной работы с данными
    #39901208
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я знаю, что делать!
Нужно
cptngrb
inc(id_p, -1)

заменить на
Код: pascal
1.
Dec(id_p)


!
...
Рейтинг: 0 / 0
Правильная организация master-detail локальной работы с данными
    #39901237
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ёёёёё, ))
...
Рейтинг: 0 / 0
Правильная организация master-detail локальной работы с данными
    #39901238
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sinemurius, про удобство для пользователя совсем забыть?
...
Рейтинг: 0 / 0
Правильная организация master-detail локальной работы с данными
    #39901247
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Большая проблема написать 2 цикла ? Тут кода на 15 строчек
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
PersonShow.First;
while not PersonShow.Eof do begin
// постим сотрудника и получаем его ID
  IdPerson := ExecSQL('insert into Person(IdDocument,PersonName) select :Id,:Name rerurn @@identity',[IdDoc,PersonShow['PersonName']]);
  AddressShow.Params[0].Value := PersonShow['IdPerson'];
  AddressShow.Open;
// постим все адреса сотрудника
  while not AddressShow.Eof do begin
    ExecSQL('insert into Adress(IdPerson,AddressName) select :Id,:Name',[IdPerson, AddressShow['AddressName']]);
    AddressShow.Next;
  end;
  AddressShow.Close;
  PersonShow.Next;
end;
...
Рейтинг: 0 / 0
Правильная организация master-detail локальной работы с данными
    #39901344
энди
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вся проблема из-за кэширования информации, оставьте кэширование только на detail таблице, а на мастере уберите. Да и вообще я могу понять когда раньше этот режим вводили для узких каналов связи которые к тому же еще и были нестабильны. Сейчас CachedUpdates скорее уже архаизм, чем объективная реальность, хотя наверное есть сценарии где имеет смысл их использовать.
Вышесказанное не более чем IMHO :)
...
Рейтинг: 0 / 0
Правильная организация master-detail локальной работы с данными
    #39901413
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
энди,
к сожалению есть куча сценариев
...
Рейтинг: 0 / 0
Правильная организация master-detail локальной работы с данными
    #39901415
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в принципе, ответ я получил - пиши ручками
...
Рейтинг: 0 / 0
Правильная организация master-detail локальной работы с данными
    #39901435
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrb,

А что мешает новый ID запрашивать не при сохранении, а при добавлении пользователя? Одно значение получить не долго, а если для ID используется BIGINT, то даже "потерянные" (из-за отмены сохранения) значения погоды не сделают?..
...
Рейтинг: 0 / 0
Правильная организация master-detail локальной работы с данными
    #39901474
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp, не хочу generator просто так дергать
...
Рейтинг: 0 / 0
Правильная организация master-detail локальной работы с данными
    #39901478
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да и к базе обращаться не комильфо постоянно
...
Рейтинг: 0 / 0
Правильная организация master-detail локальной работы с данными
    #39901508
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrb
да и к базе обращаться не комильфо постоянно

А у вас каждые 15 секунд начинают добавлять пользователя и отменяют?
...
Рейтинг: 0 / 0
Правильная организация master-detail локальной работы с данными
    #39901513
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrb
Какие есть стандартные изящные решения?

Стандартные или изящные?

В целом, вменяемых решений, имхо, два:

  • Запрашивать на клиента пул сгенерированных айдишников. Выдавать их новым записям и сохранять данные сразу с ними. Когда пул кончается - запрашивать следующий. Размеры пула взять с потолка.
  • Делать на клиенте временные айдишники. Сохранять данные через insert/returning либо его аналог с возвратом уже серверных id. Вернувшиеся id класть в map. При сохранении внешних ключей с помощью map перекодировать временные id в постоянные. Сделать всё это стандартным механизмом, автоматически работающим в нужных местах.
...
Рейтинг: 0 / 0
Правильная организация master-detail локальной работы с данными
    #39901535
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerЕсть и невменяемые, например, использовать вместо айдишников гуиды.

А что в них невменяемого-то? Если гуид последовательный и приведён к нужной раскладке
байт, то он ничем не хуже любой другой последовательности.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Правильная организация master-detail локальной работы с данными
    #39901546
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

да, в принципе сильновато я на них наехал, зря. Они длинные, с ними неудобно работать. В случае ИС, распределённой по нескольким серверам, в них не получится нормально уложить номер сервера. Но не настолько плохо, чтобы говорить о невменяемости.
...
Рейтинг: 0 / 0
Правильная организация master-detail локальной работы с данными
    #39901554
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerВ случае ИС, распределённой по нескольким серверам, в них не получится нормально уложить
номер сервера.

А зачем кому-то наживать себе геморрой, нарушая первую НФ?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Правильная организация master-detail локальной работы с данными
    #39901557
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
А зачем кому-то наживать себе геморрой, нарушая первую НФ?

Нарушения 1НФ в этом нет. Атомарность значения - вообще жупел, которым часто трясут без осознания, зачем она нужна, когда и чем плохо её нарушение и, соответственно, какие варианты нарушают 1НФ, а какие - нет. Но когда работаешь с данными, удобно с одного взгляда видеть, на каком сервере родилась запись - это резко ускоряет все разбирательства.
...
Рейтинг: 0 / 0
Правильная организация master-detail локальной работы с данными
    #39901576
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerНарушения 1НФ в этом нет.

Её нет пока никто не пытается этот номер сервера обратно выковырять.

softwarerкогда работаешь с данными, удобно с одного взгляда видеть, на каком
сервере родилась запись
Да, удобно. Но зачем эту информацию в поле первичного-то ключа всобачивать? И ладно бы это
был составной ключ...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Правильная организация master-detail локальной работы с данными
    #39901577
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Её нет пока никто не пытается этот номер сервера обратно выковырять.

Именно так. А если ещё точнее, то "никто не пытается выковырять обратно программным кодом и использовать в бизнес-логике". То, что он будет виден глазами айтишнику, копающемуся в данных - к 1НФ отношения не имеет.

Dimitry Sibiryakov
Да, удобно. Но зачем эту информацию в поле первичного-то ключа всобачивать?

Затем, что это оптимум по цена/качество. Точнее - я с большим интересом узнаю про подход лучше, но сомневаюсь, что такой увижу.
...
Рейтинг: 0 / 0
Правильная организация master-detail локальной работы с данными
    #39901579
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerЗатем, что это оптимум по цена/качество.

Кто-то ещё всерьёз пытается экономить на байтах записи или количество нод зашкаливает за
65536?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Правильная организация master-detail локальной работы с данными
    #39901581
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Кто-то ещё всерьёз пытается экономить на байтах записи или количество нод зашкаливает за 65536?

Мне кажется, тебе пора спать. Я же в любом случае уже сказал:

Точнее - я с большим интересом узнаю про подход лучше, но сомневаюсь, что такой увижу
...
Рейтинг: 0 / 0
Правильная организация master-detail локальной работы с данными
    #39901583
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerя с большим интересом узнаю про подход лучше, но сомневаюсь, что такой увижу

Выделить на происхождение записи целое отдельное поле, да ещё и со ссылкой на справочник
филиалов, было бы слишком просто?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Правильная организация master-detail локальной работы с данными
    #39901584
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Выделить на происхождение записи целое отдельное поле, да ещё и со ссылкой на справочник филиалов, было бы слишком просто?..

Это было бы неоправданно трудоёмко. Та простота, которая хуже воровства.
...
Рейтинг: 0 / 0
Правильная организация master-detail локальной работы с данными
    #39901604
zeon11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
Dimitry Sibiryakov
Выделить на происхождение записи целое отдельное поле, да ещё и со ссылкой на справочник филиалов, было бы слишком просто?..

Это было бы неоправданно трудоёмко. Та простота, которая хуже воровства.


Это та простота, которая и должна быть (вроде как 5NF)
При принятии подхода Dimitry Sibiryakov Выделить на происхождение записи целое отдельное поле, да ещё и со ссылкой на справочник филиалов
мы получаем симметричную ИС в части слияния-разделения баз данных.
Т.е. мы легко получим из филиальных баз данных одну материнскую, и так-же легко из одной материнской получим набор филиальных баз данных. Следствием этого подхода будет и лёгкость реализации, например, аудита филиалов разными сотрудниками при их работе с материнской БД.
В случае же отказа от 5NF применением составного первичного ключа (а в Вашем случае, как я понял, информацию о сервере Вы предлагаете вообще "подмешивать" к первичному ключу типа 001230000000056889, где 123 номер сервера, а 56889 номер записи на сервере), обратное разделение БД хотя и возможно, но будет достаточно трудоемко, да и на всякие плюшки сервера (типа ссылочной целостности и т.п.) рассчитывать не приходится.
Ну и по поводу просмотра записей системным администратором. Можно пролистать несколько экранов с записями, но просмотреть несколько миллионов записей совсем нереально. Тут придётся, хотите-не хотите делать запросы.
В случае принятия подхода Dimitry Sibiryakov запрос будет выглядеть как-то так:
Код: sql
1.
select first 1000 m.* from MyTable m where m.id_server=123 order by m.MyTable_ID 


Просто? да, просто. Причём и отработается запрос быстро.
В Вашем случае запрос будет такой:
Код: sql
1.
select first 1000 m.* from MyTable m where m.id like '00123%'  order by m.ID 


Уже весело, и с задорным оптимизмом смотрим в будущее, где нам надо выбрать записи 123 сервера с номера 5000 по номер 7000
...
Рейтинг: 0 / 0
Правильная организация master-detail локальной работы с данными
    #39901661
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrb
в принципе, ответ я получил - пиши ручками
да, написать один раз либу/компонент а потом юзать легко как стандартное
...
Рейтинг: 0 / 0
Правильная организация master-detail локальной работы с данными
    #39901678
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zeon11
информацию о сервере Вы предлагаете вообще "подмешивать" к первичному ключу типа 001230000000056889, где 123 номер сервера, а 56889 номер записи на сервере
если уж и закладывать в айдишник номер ноды/сервера (сам кое где делаю) то не так тупорыло же
zeon11
Уже весело
богатая конечно идея к айдишникам по маске как к строкам обращаться
...
Рейтинг: 0 / 0
Правильная организация master-detail локальной работы с данными
    #39902069
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ноды, сервера, что-то товарищи совсем углубились. Мне интересны подходы работы на стороне клиента БД, как локально не напортачить, а на сервере будет генератор за меня уникальные числа получать. Если же вы рассматриваете распределенную систему, то по моему опыту самое простое решение это GUID.
...
Рейтинг: 0 / 0
Правильная организация master-detail локальной работы с данными
    #39902071
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То есть систему из клиента и сервера ты отказываешься рассматривать как распределённую?
Это зашоренность.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Правильная организация master-detail локальной работы с данными
    #39902136
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На клиенте юзать отрицательные ID и автодекремент, потом в MasterTable.BeforePost скопом получить из базы валидные ID для каждого отрицательного, заполнить их в MasterTable и Detail таблицах, в MasterTable.AfterPost сделать Post всех деталей, всё
...
Рейтинг: 0 / 0
Правильная организация master-detail локальной работы с данными
    #39902343
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, что на сервере то на сервере, как организовать id дело рук хранимых процедур
...
Рейтинг: 0 / 0
44 сообщений из 44, показаны все 2 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Правильная организация master-detail локальной работы с данными
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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