|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
04.07.2013, 09:42 | #1 |
Пользователь
Регистрация: 26.12.2009
Сообщений: 95
|
как правильно организовать многовложенность в бд
Привет всем! пишу программу, в которой следующая иерархия -
клиент > карточка клиента>авто>карточка авто и еще 4-5 вложений . Вопрос как все это лучше связать, что бы все вложенности относились только конкретному клиенту. Создать у клиента id, а все остальные вложенности должны просто копировать себе его id? пишу на delphi+mysql |
04.07.2013, 09:54 | #2 |
Ваш К. О.
Участник клуба
Регистрация: 26.12.2012
Сообщений: 1,755
|
В данном случае -- никак, поскольку эта вложенность искусственная, поскольку сами данные разнородны и не являются деревом. Нужно создать обычную реляционную БД по учебникам, а вложенность, если так уж хочется, рисовать чисто в интерфейсе.
|
04.07.2013, 10:04 | #3 |
Пользователь
Регистрация: 26.12.2009
Сообщений: 95
|
базу создавать умею, программы подобные писал максимум с 3 уровнями, т.е во всех трех таблицах были id , а потом запросом выводил в грид, все получалось, я думаю, может есть какой более удобный способ?
иметтся ввиду что у меня есть dbgrid, двойной клик по записи > еще грид, в котором данные только по этой записи, и так далее |
04.07.2013, 10:27 | #4 |
Ваш К. О.
Участник клуба
Регистрация: 26.12.2012
Сообщений: 1,755
|
Это классическая задача из учебника. Ведь пишется что-то вроде БД автосервиса?
Главное окно программы -- список клиентов (грид), при клике на клиента открывается его карточка -- диалог, где вписаны его ФИО и другие данные, плюс грид с принадлежащими ему машинами (можно на вкладке). При клике на машине, в свою очередь, открывается карточка машины, где вписаны все данные и может быть грид с описанием ремонтов (тоже на вкладке). Деревом тут и не пахнет. |
04.07.2013, 10:48 | #5 | ||
Участник клуба
Регистрация: 19.12.2007
Сообщений: 1,100
|
Цитата:
Можно и деревом, а можно и в виде обычных внешних связей - цепляясь по id предыдущего уровня. Цитата:
id "клиента" будет основным ключем только для "авто", а id "авто" будет основным ключем для "следующего вложения" и т.д. конечно, можно id "клиента" писать во все вложения, но это уже будет избыточно, хоть и будет дополнительным вторичным ключем
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ... Последний раз редактировалось Yurk@; 04.07.2013 в 10:53. |
||
04.07.2013, 11:19 | #6 |
Старожил
Регистрация: 17.11.2010
Сообщений: 19,042
|
Здесь похоже везде отношение один-к-одному. Разве что у клиента несколько машин. Тогда и нет ни какой необходимости данные распылять по нескольким таблицам. Если один-к-многим тогда как Yurk@ предложил
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
04.07.2013, 12:00 | #7 |
Пользователь
Регистрация: 26.12.2009
Сообщений: 95
|
разумеется, у клиента несколько машин, а у каждой машины несколько таблиц, с этим теперь понятно, спасибо))
Сразу хочу еще вопрос задать - как в 1 dbgrid выводить несколько запросов, если его можно только к 1 query привязать? для чего нужно - при открытии формы в db grid запрос выводит все записи, при нажатии на кнопку сортировать например - только грузовые, чтобы сработал уже другой запрос и в этот же грид вывел эти записи. или придется делать столько гридов друг на друге, сколько и запросов, при этом при нажатии на кнопки "только грузовые","только легковые" - скрывать ненужные гриды? |
04.07.2013, 12:08 | #8 | |
Участник клуба
Регистрация: 19.12.2007
Сообщений: 1,100
|
Цитата:
пример: Код:
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ... Последний раз редактировалось Yurk@; 04.07.2013 в 12:11. |
|
04.07.2013, 12:17 | #9 |
Пользователь
Регистрация: 26.12.2009
Сообщений: 95
|
но не совсем понял, запросы то у меня разные,то есть изначально
select * from avto - в grid весь список если нажимаю кнопку только грузовые, то select * from avto where tip=gruzovie - и результат выводится в этот же грид. то есть непонятно что надо прописать на кнопку чтобы в грид выполнялся другой запрос? а если писать в 1 запросе то вообще не понятно как кнопка поймет какой ей sql.add выполнить, а какой пропустить |
04.07.2013, 12:48 | #10 |
Ваш К. О.
Участник клуба
Регистрация: 26.12.2012
Сообщений: 1,755
|
Кнопка не поймет, она думать не умеет. Понять должен программист.
Если предложение where является последним в запросе, достаточно будет присваивать SQL.Strings[SQL.Strings.Count - 1] нужное значение. Если же запрос простой, достаточно воспользоваться параметрами и менять только значение параметра, оставляя текст запроса неизменным. В учебниках именно этому и учат. Возвращаясь же к интерфейсу, хочу заметить, что вложенные диалоги в интерфейсе удобны для ведения общего реестра, а для приемки машины в ремонт в главном окне наверняка потребуется отдельная вкладка, где в гриде будут выводиться текущие ремонты -- машины, стоящие на ремонте или уже отремонтированные, но ожидающие своих хозяев. Диалоги для приема в ремонт и выдачи должны быть выполнены отдельно от диалогов реестра, иначе вашей программой никто пользоваться не будет. Возможно, что постановку на ремонт и выдачу можно объединить в одном диалоге, -- тут уже на месте смотреть надо. |
|
Опции темы | Поиск в этой теме |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Как правильно организовать хранение | tarakan1983 | SQL, базы данных | 1 | 08.06.2012 19:46 |
Как правильно организовать сохранение в файл delphi | JK0 | Помощь студентам | 1 | 21.12.2010 21:14 |
Как правильно организовать непростой шаблон двоичного дерева? | nowaalex | Общие вопросы C/C++ | 10 | 02.12.2010 02:47 |
как правильно организовать продажу своего софта? | broderweb | Свободное общение | 11 | 02.12.2009 17:41 |
ADO + SQL Server. Как правильно организовать одновременную работу с таблицей | Mouse123 | БД в Delphi | 17 | 04.07.2008 17:35 |