![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Заблокирован
Регистрация: 04.07.2011
Сообщений: 261
|
![]()
Здравствуйте!
В БД есть таблицы ТД и ТЮ с некими данными, а также ТС где должны храниться связи отдельных записей ТД с записями ТЮ. В программе есть 3 окна - 1.Каталог берущий данные из ТД, 2.Редактор конкретной записи ТД, 3.Список выбора связей этой записи с некими другими данными при помощи checkbox сохраняется в БД в таблицу ТС. Юзер открывает 1.Каталог и выбирает нужную запись, открывает 2.Редактор и правит там данные - всё очевидно. Вопрос со списком выбора - как его правильно реализовать? как правильно построить логику сохранения списка и хранения выбранных связей в БД при условиях, что: - обе таблицы ТД и ТЮ изменяются пользователем - дополняются, редактируются и удаляются. - при открытии в редакторе записи ТД, юзер должен видеть полный список ТЮ с возможностью поставить напротив каждой записи галочку. - второстепенно - желательно уменьшить объём хранимых данных в БД и упростить саму БД по возможности. PS Как быстрее работает - если хранить каждую связь таблиц отдельной записью в отдельной "таблице связей ТС" или если хранить в одном поле таблицы ТД весь список и затем парсить его в БД при необходимости (во втором случае отсутствует необходимость в поиске-выборке, отсутствует таблица и все данные ТС)? |
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
![]()
В любом случае эти ссылочки лучше в отдельной таблице хранить, с ней на порядки удобней работать, чем со строковым списком (если реализуете, то замучаетесь в последствии). В случае удаления записей из основных таблиц легко через триггера удалять соответствующие ссылки, да и программо нет проблем
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Последний раз редактировалось Аватар; 06.09.2011 в 10:07. |
![]() |
![]() |
![]() |
#3 |
Заблокирован
Регистрация: 04.07.2011
Сообщений: 261
|
![]()
Видимо да, но объём лишних данных и процедур несколько огорчает.
В частности пока не очень понял как записывать выбранные значения в БД в таблицу ТС? Подробнее - чтобы отобразить пользователю список всех ТЮ - в БД при помощи хранимой процедуры склеиваем ТЮ и ТС, из ТС берутся значения "связь да/нет". Отправили в интерфейс - получили таблицу в которой видно все ТЮ и напротив используемых стоит галочка из ТС. Всё понятно. Далее юзер ставит/убирает галочки в интерфейсе показывая какие связи ему нужно записать в БД - понятно. А вот как это дело обратно записать в БД непонятно ![]() Последний раз редактировалось delphicoding; 06.09.2011 в 10:45. |
![]() |
![]() |
![]() |
#4 | |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
![]() Цитата:
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
|
![]() |
![]() |
![]() |
#5 |
Заблокирован
Регистрация: 04.07.2011
Сообщений: 261
|
![]()
Можно и без ХП, это мне без разницы.
Просто не очень понимаю как реализовать delete or insert связей в ТС да ещё когда создаётся новая запись и ТД_ID неизвестен до момента записи в самой БД... |
![]() |
![]() |
![]() |
#6 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
![]()
Delete в TC очень просто через триггера на удаление записей основных таблиц. Вставив новую запись в основную таблицу, идентификатор в ней видимо автоинкриментный, тут же выдерните из базы максимальное значение этого идентификатора - это и будет ваш неизвестный ID. Такой механизм для работы с базой одновременно нескольких пользователей мне не нравится. Поэтому и не использую автоинкриментность, а сам уникальные идешки формирую
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Последний раз редактировалось Аватар; 06.09.2011 в 11:41. |
![]() |
![]() |
![]() |
#7 |
Заблокирован
Регистрация: 04.07.2011
Сообщений: 261
|
![]()
Это криво именно из-за работы нескольких юзеров. Триггер имхо ничем не лучше ХП, а только хуже.
Нет, нужно сделать именно так, как я описал выше, только я не знаю как это сделать... ![]() Для получения правильного номера новой вставленной записи ТД можно использовать RETURNING, но мне кажется работать он будет исключительно внутри самой БД и в программу обратно он никак не дойдёт, в частности тк FIBDataset просто не станет принимать никаких ответов после Post... в общем я не очень понимаю как эти связи обратно insert or delete в БД ??? |
![]() |
![]() |
![]() |
#8 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
![]()
А SELECT MAX(id) FROM ... уже отменили?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
![]() |
![]() |
![]() |
#9 |
Заблокирован
Регистрация: 04.07.2011
Сообщений: 261
|
![]()
Если два юзера А и Б одновременно создают разные новые записи ТД, спрашивают maxid ТД, а затем отправляют данные ТС на insert... что получится??? хрень получится - мало того, что связи отправленные юзером Б перезапишут/дополнят связи записанные юзером А, так ещё и у записи ТД отправленной юзером Б вообще не будет связей в ТС!
И вообще использовать Max(ID) некорректно, тк если ранее была добавлена запись 100, а затем удалили записи 91-100, то значение Max(ID) выдаст 90, тогда как правильное значение которое задаст Генератор - 101 !!! Так что ваш вариант не подходит. Последний раз редактировалось delphicoding; 06.09.2011 в 12:28. |
![]() |
![]() |
![]() |
#10 | ||
Старожил
Регистрация: 20.04.2008
Сообщений: 5,543
|
![]() Цитата:
Код:
если пользователи вводят одинаковые товары в каталог, то нужны или административные меры или нормальные средства поиска в каталоге, а не показывать ВСЕ записи в окне 1 (список товаров). И для одинаковых товаров без разницы кто ввел их связи. Цитата:
программа — запись алгоритма на языке понятном транслятору
Последний раз редактировалось evg_m; 06.09.2011 в 12:40. |
||
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Атрибуты выпадающего списка, как ускорить выбор в выпадающем списке | sevalery | PHP | 1 | 01.08.2011 13:51 |
Как задать выбор значения с помошью списка в VBA? | k.soldatova | Помощь студентам | 4 | 20.07.2011 16:58 |
как реализовать сложный выбор из выпадающего списка? | yulkas | Помощь студентам | 9 | 22.03.2010 09:54 |
Как ограничить выбор списка или сделать зависимость? | Стасон | Microsoft Office Excel | 4 | 29.03.2009 09:18 |
сортировка динамического списка | new_sergei | Помощь студентам | 1 | 19.12.2008 00:36 |