Форум: "Базы";
Текущий архив: 2003.10.27;
Скачать: [xml.tar.bz2];
ВнизВопрос по связи таблиц Найти похожие ветки
← →
leonidus (2003-10-06 16:44) [0]У меня такая задача: есть таблица в которую занесены такие записи как "Болт", "Гайка", "Шайба", "Крышка" ну и пр. у каждой записи всего два поля "Описание" и "Картинка". Эту таблицу я создал и все ок. Но теперь надо еще одну таблицу связанную с первой, во второй таблице должны быть записи типа "Деталь1", "Деталь2" и т.п. и каждую запись из воторой таблице надо связать с несколькими записями первой, т.е. при выборе из второй таблице записи "Деталь1" в первой таблице отобразился бы список всех связанных с ней полей (например "Крышка", "Болт", "Гайка"). Я не как не могу разобраться как осуществить связь и как потом программно а не в режиме дезайна проекта менять связи между таблицами. Пожалуйста подскажите, как мне быть, горит курсовик!
← →
Alex_D (2003-10-06 16:48) [1]В первой таблице добавляешь поле ID, а во второй поле типа SubDetail, содержащее номер комплектующего.
← →
leonidus (2003-10-06 16:58) [2]Хорошо это сделать не трудно, но как осущесвить сам процес связи?
← →
Vlad (2003-10-06 17:04) [3]>leonidus (06.10.03 16:58) [2]
Написать SQL запрос. Что-то типа select a.*, b.* from table1 a left join table2 b on a.id=b.id
И будет тебе счастье
← →
MsGuns (2003-10-06 17:47) [4]Кладешь два TQuery: один для основного НД, второй для деталей, входящих в запись основного. Для второй в свойстве DataSourse указываешь первую. В SQL`е 2-го запроса пишешь SELECT ... where idd := :idm (idd - UID мастера в детеле, idm - UID мастера)
← →
Term (2003-10-06 17:48) [5]а какие компаненты используеш?
← →
Term (2003-10-06 17:54) [6]если используеш TTable,
еще проще создай индексы по полям связи, положи DataSourse,
свяжи его с основной таблицей, а в зависимой вставь его в св-во MasterSourse, в свойстве MasterField подчинённой таблице установи связь
← →
leonidus (2003-10-06 19:14) [7]Я использую TTable и пока с SQL-запросами не занаком, мы до них еще не дошли. Про MasterSourse я понял, уже установил это свойство в главной таблице, а как программно устанавливаются связи в свойстве MasterField не пойму. И еще что значит "создай индексы по полям связи" т.е. в каждую записть ввести еще одно поле индекса?
← →
MsGuns (2003-10-06 21:24) [8]>leonidus (06.10.03 19:14) [7]
>Я использую TTable и пока с SQL-запросами не занаком, мы до них еще не дошли.
Для Парадокса это гроб (TTable), но для курсача сойдет и так
Про MasterSourse я понял, уже установил это свойство в главной таблице, а как программно устанавливаются связи в свойстве MasterField не пойму
1. А что, в дизайне нельзя, надо именно в ране ?
2. Точно также, как и в дизайне, присваивая св-ву имена связующих полей, разделенных ";" (текстовая строка)
3. В детальной таблице обычно связующие поля не отображаются в гриде (это и понятно,- ведь их значения совпадают с полями мастера, обычно отображаемые в визуальных контролах, гриде, например)
4. При вставках поля связки заполняются автоматически, - не надо их трогать.
5. Изменять поля связки в детале тоже нежелательно, т.к. запостенная запись сразу "вылетит" из связанного подмножества, да и таблицы обычно летят часто именно при такой "технологии"
> И еще что значит "создай индексы по полям связи" т.е. в каждую записть ввести еще одно поле индекса?
Поля для связки в детале должны быть primary key. Если бы работал с TQuery, то там это не обязательно. Индексы создаются для ускорения доступа к таблицам и делаются достаточно просто - почитай хэлпы в методах того же TTable (AddIndex). Для этого не надо добавлять никаких полей, просто одно или несколько полей назначаются как индекс и по ним BDE построит доп.таблицу, существенно ускоряющую выборку и изменение, а также обеспечится нужная упорядоченностей записей в НД
--------------------------------------------------------------------------------
← →
Term (2003-10-07 09:12) [9]
> почитай хэлпы в методах того же TTable (AddIndex).
лучше создать все индексы заранее тем более для курсача, с помощью Database DeskTop, а то при постоянном вызове AddIndex ,будет вываливаться исключение, в принципе его можно обработать, но в данном примере лучше без этого
← →
leonidus (2003-10-07 10:04) [10]Надо именно в run-tim`e устанавливать все связи, т.к. на момент запуска программы обе таблицы будут еще пусты, а потом препод сам заполнит дочернюю таблицу и главную и свяжет те записи которые захочет. И еще я не пойму, мне же дано не поля связывать а записи т.е. запись "Деталь1" из главной таблице должна быть связана с записью "Болт" и "Гайка" из дочерней таблицы, или я гле-то не прав? А вообще-то если использовать TQuery технология на много упроститься? Я просто думаю может несколько модифицировать задачу под SQL?
← →
Sergey13 (2003-10-07 10:13) [11]2leonidus (07.10.03 10:04) [10]
>на момент запуска программы обе таблицы будут еще пусты, а потом препод сам заполнит дочернюю таблицу и главную и свяжет те записи которые захочет
Ты наверное плохо препода слушал на лекциях. Хелп читать еще рано, надо бы книжку какую умную, вместо лекций чтоб.
← →
Term (2003-10-07 10:20) [12]
> А вообще-то если использовать TQuery технология на много
> упроститься?
упроститься если ты хотя бы немного знаком с SQL, подчёркиваю хотябы немного, но судя по всему ты за БД ваще в первый раз взялся, а в run-time выбрать поля и связать что за бред...
если уж не можеш своими словами объяснить что тебе нужно, хотя бы приведи текст задания как он есть, в твоём курсовом, так больше толку будет
← →
MsGuns (2003-10-07 11:25) [13]>leonidus (07.10.03 10:04)
>.. а потом препод сам заполнит дочернюю таблицу и главную и свяжет те записи которые захочет. И еще я не пойму, мне же дано не поля связывать а записи т.е. запись "Деталь1" из главной таблице должна быть связана с записью "Болт" и "Гайка" из дочерней таблицы, или я гле-то не прав?
Судя по всему, у тебя отсутствует само понимание принципа связки "один-ко-многим" и способ лечения этой болезни один - почитать книжки (хэлпы предполагают хотя бы общее знакомство с теорией)
← →
leonidus (2003-10-07 12:18) [14]Ну че вы налетели все, не программистов из нас готовят, а инженеров, поэтому базы даннх преподают отвратно, но курсач все равно надо сделать. Почитал я тут про SQL очень занимательно, и на сколько я понял он как раз и предназначен для выборки из базы данных определенных записей по запросу. Как вы считаете может стоит просто перейти на TQuery и SQL запросоами выбирать из дочерней таблицы те поля которые мне нужны?
>Term зачем так резко "бред", может я конечно многово не понимаю (я действительно первый раз с базами работаю), но я же стараюсь... я ведь правильно понимаю, что в ЗАПИСЬ например "Гайка" входит ПОЛЯ "описание" и "картинка" а ЗАПИСЬ "Деталь1" должна быть связана с записью "Гайка" а не с ее полями, или не так, почему вас всех смущает фраза "связать записи"?
← →
MsGuns (2003-10-07 13:24) [15]>leonidus (07.10.03 12:18) [14]
> <Абзац 1>
Никто на тебя не налетал, наоборот, все тебе намекают, а кое-кто и прямо говорит, что нельзя браться за проектирование баз данных, совершенно не зная теории, для чего советуют обратиться к книгам.
TQuery или TTable (а есть еще много других, зачастую намного более эффектнивных инструментов) - для организации связи "Один-ко-многим" или Master-Detail на языке профи, - не играет никакой рояли. Просто "табличный метод" присущ локальным базам и постепенно уходит в прошлое. Но он более интуитивно понятен именно для новичков, не знакомых с понятем коннектов, серверов, тонких клиентов и т.д.
> <Абзац 2>
Не надо так реагировать на слова. По сути Term прав и если обижаться на то, в какой форме Мастер дает тебе знать об ошибке, лучше вообще не учиться, а устроиться в Институт Благородных Девиц сторожем.
О сути. Для начала абстрагируйся от понятий "Деталь", "Запись, "Поле" и т.д. Вообрази себе все в виде объектов, обладающих собственными свойствами. Между этими объектами существуют связи и зависимости. Вот и нарисуй себе такую схемку. Затем подумай о том, что надо иметь нечто у каждого объекта, что отвечало бы за связь его с другим объектом и т.д. Ну а если почитаешь любую книжку по основам пректирования БД, то все получится куда быстрее и лучше
Ты
← →
Term (2003-10-07 15:55) [16]
> Term зачем так резко "бред",
я тебя обижать ничем нихотел и не собирался, я сам частенько достаю мастеров вопросами и не обижаюсь не на какие выражения если не знаю лучше всё стерпеть но разобраться.
Вот тебе немного теории в двух словах:
короче начни с TTable, так как задачка у тебя простенькая и когда разберешся в сути вот тогда и за SQL и всё прочее возьмёшся.
Короче у тебя предположим 2 таблицы тебе их надо связать как енто провернуть. У первой таблицы назовём её мастер-таблицей обязательно должно быть поле по которому строиться главный индекс или ключ, и оно должно иметь уникальное значение в каждой записи, вторая таблица назовёт её детальной-таблицей, должна иметь обязательно два поля(это те которые отвечают за связь, а поля которые несут инфу я не затрагиваю), одно также ключевое, а второе поле связи, по нему строиш вторичный индекс. Вот минимальные сведения в двух словах.
Дальше в делфе на форму кладёш TTable называеш его к примеру Master, связываеш его с мастер таблицей. Затем кладёш TDataSourse и еще один TTable, тайбл назови к примеру Detail.
Указываеш у них соответсвенные индексные поля.
Далее TDataSourse связываеш с Master, а у Detail указываеш его как MasterSourse, затем указываеш MasterField.
и всё будет работать....
только не меняй руками поля связи
← →
leonidus (2003-10-08 00:08) [17]Подскажите пожалуйста где в инете можно прочитать про основы баз данных и в частности связь таблиц?
← →
Zacho (2003-10-08 00:17) [18]
> leonidus (08.10.03 00:08) [17]
Скажу честно: предидущие посты не читал.
Но настоятельно советую прочитвть и осмыслить К.Дж.Дейт "Введение в системы баз данных"
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.10.27;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.01 c