Как правильно работать с Primary Key и Foregrin Key

bizisoft
Дата: 04.05.2012 13:47:43
Здраствуйте.

Подскажите пожалуйста.

1) Как в С++ Builder правильно организовать работу с первичными и вторичными ключами, а именно, чтобы в соответствующих полях DB_GRID-a отображалось значение подставляемого поля, а не его идентификатор.

Например есть две таблицы:

TB_1 (таблица справочник)
ID_NOM (Первичный ключ) (автоинкремент - тригер + генератор) 
NUMBER_TOVARA (uniq key)
NAME_TOVARA
DESCRIPTION


TB_2 (таблица - например заказы)
ID_ZAK (Первичный ключ) (автоинкремент - тригер + генератор) 
NUMBER_ZAKAZ
ID_NOM (Вторичный ключ)
COUNT
SUMMA


2) Подскажите пожалуйста, как при такой связи таблиц правильно делать запрос на выборку, вставку, изменения и удаление данных?

3) Как правильно будет получать сводную информацию по данным, если они находятся в разных таблицах? Создавать временную таблицу и посредством запросов копировать в нее данные из других таблиц или есть уже изобретенный велосипед, который предназначен для подобных действий.
Это требуется для того, чтобы пользователь выдел состояние например по определенному номеру товара видел (из_справочника_номенклатуры - наименование, описание, ...), (из_таблицы_цены - цену), (из_таблицы_остатки - остаток на складах), (из_таблицы_заказы - уже заказаное количество) и т.д.

Никак не могу понять, как это осуществляется в InterBase (после Access-а).
Также не понятно каким образом осуществляется поддержка ссылочной целостности данных, и связи один-один, один-многим ...

Просветите пожалуйста и по возможности дайте ссылку на хорошую книгу где это подробно расписано (касательно InterBase).

Спасибо большое.

С Уважением, Дмитрий.
Мимопроходящий
Дата: 04.05.2012 13:49:16

даже не знаю что и сказать

Posted via ActualForum NNTP Server 1.5

Микросекунда
Дата: 04.05.2012 13:56:13
Мимопроходящий пишет:

М> даже не знаю что и сказать

Для начала можно послать его сюда: http://www.ibase.ru/devinfo/ibx.htm

Posted via ActualForum NNTP Server 1.5

Граур Станислав
Дата: 04.05.2012 13:58:42
bizisoft
Просветите пожалуйста и по возможности дайте ссылку на хорошую книгу где это подробно расписано (касательно InterBase).


Чти вот тут.

Там в конце список литературы. Со ссылками где купить.
Начать советую с Грабера.
Удачи.

P.S.
Студент? Кулинарного техникума?
bizisoft
Дата: 04.05.2012 14:37:20
to Граур Станислав

Да нет не кулинарного.
Просто уже запутался в этом всем - в Access как бы все ясно (там можно сказать все визуально делается), а вот в InterBase чего-то никак не врублюсь.

P.S. Спасибо за наводку на литературу.

to Микросекунда

Ну как работать с компонентами я знаю. Первым делом я на ibase.ru смотрел:
Здесь - http://www.ibase.ru/devinfo/ibx.htm
Здесь - http://ibase.ru/develop.htm#doc
...
А уж когда ничего не нашел пришел сюда спрашивать.

Я хочу переписать свою базу и программу, чтобы было сделано все правильно, а именно использовать нормализованную форму БД, ссылочную целостность данных, чтобы не было избытка данных.

А то получается (в данный момент) в таблице-справочнике есть поле с номером_детали и это-же поле выступает в качестве Первичного ключа (ПК), в другой таблице как-бы есть такое-же поле в котором также содержится номер_детали (получается избыток данных), а хочется чтобы все было завязано на ссылках (в Access в поле выбираеш "подстановка" потом выбираешь поле/я которые будут отображаться вместо ссылки).
В InterBase у меня не получается такое сделать - в полях отображаются только идентификаторы, которые соответствуют тому или иному номеру в таблице-справочнике. :-(
Dimitry Sibiryakov
Дата: 04.05.2012 14:43:34

bizisoft
А уж когда ничего не нашел пришел сюда спрашивать.

Это ж как хреново надо искать, чтобы не найти
это?..

Posted via ActualForum NNTP Server 1.5

Мимопроходящий
Дата: 04.05.2012 14:45:02

Hello, bizisoft!
You wrote on 4 мая 2012 г. 14:44:19:

bizisoft
> В InterBase у меня не получается такое сделать - в
полях отображаются только идентификаторы, которые соответствуют тому или
иному номеру в таблице-справочнике. :-(

для этого и придумали SQL-запросы.
дабы извлекать ВСЮ нужную информацию
из реляционной базы.

Posted via ActualForum NNTP Server 1.5

bizisoft
Дата: 04.05.2012 15:34:28
Dimitry Sibiryakov
Это ж как хреново надо искать, чтобы не найти
это?..




http://ibase.ru/devinfo/joins.htm
Допустим, a это справочник пользователей, а b это таблица заказов. В этом случае мы объединяем таблицы пользователей и заказов по столбцу первичного ключа таблицы a и столбцу связи таблицы b.

Дополнительные условия в where - это дополнительная "фильтрация" результатов запроса. Например, нам надо выбрать всех клиентов, которые делали заказы в определенный период
select c.id, c.name
from clients c, orders o
where c.id = o.c_id


Ну вот в самом начале и начинают путать:

Как бы с "а"-таблица пользователей и "b"-таблица заказов - понятно.
Можно предположить, что "с" это 3-я таблица в которой имеются вторичные ключи на таблицы "a" и "b".
Не понятно, что такое clients c, orders o. clients и orders - что это таблицы или поля, "о" - это вообще нигде не обозначается, что это такое (возможно и таблица - но какая?)

Дальше просто не читал ибо могу окончательно запутаться.

P.S. Может быть Вам и понятно эти детали, то меня это еще больше запутывает, т.к. не понятно где что.
Мне было-бы понятнее если существовало не большое введение или так сказать определение где что.
С=X+Y*Z
где X-?
Y-?
Z-?
С-?
а уж потом разбор конструкций.

Прошу меня простить если что не так.
Dimitry Sibiryakov
Дата: 04.05.2012 15:40:23

bizisoft
Мне было-бы понятнее если существовало не большое введение или так сказать определение где
что.
С=X+Y*Z
где X-?
Y-?
Z-?
С-?
а уж потом разбор конструкций.

Language Reference

Posted via ActualForum NNTP Server 1.5

Zim-a
Дата: 04.05.2012 15:53:49
bizisoft
http://ibase.ru/devinfo/joins.htm
Допустим, a это справочник пользователей, а b это таблица заказов. В этом случае мы объединяем таблицы пользователей и заказов по столбцу первичного ключа таблицы a и столбцу связи таблицы b.

Дополнительные условия в where - это дополнительная "фильтрация" результатов запроса. Например, нам надо выбрать всех клиентов, которые делали заказы в определенный период
select c.id, c.name
from clients c, orders o
where c.id = o.c_id


Ну вот в самом начале и начинают путать:

Как бы с "а"-таблица пользователей и "b"-таблица заказов - понятно.
Можно предположить, что "с" это 3-я таблица в которой имеются вторичные ключи на таблицы "a" и "b".
Не понятно, что такое clients c, orders o. clients и orders - что это таблицы или поля, "о" - это вообще нигде не обозначается, что это такое (возможно и таблица - но какая?)

Нет-нет, с и о это уже другой пример.


Правильно читать так:
Кусочек №1:
http://ibase.ru/devinfo/joins.htm
Неявные объединения таблиц - это синтаксис SQL89. На тот момент в стандарте SQL явные join еще отсутствовали. Конструкция достаточно проста:

select ... from a, b
where a.id = b.a_id


Допустим, a это справочник пользователей, а b это таблица заказов. В этом случае мы объединяем таблицы пользователей и заказов по столбцу первичного ключа таблицы a и столбцу связи таблицы b.


Кусочек №2:
Очевидно,

clients - таблица клиентов,
чтобы писать меньше кода и было проще читать, мы присваиваем ей алиас (псевдоним) c

orders - таблица заказов,
чтобы писать меньше кода и было проще читать, мы присваиваем ей алиас (псевдоним) o

http://ibase.ru/devinfo/joins.htm
Дополнительные условия в where - это дополнительная "фильтрация" результатов запроса. Например, нам надо выбрать всех клиентов, которые делали заказы в определенный период

select c.id, c.name
from clients c, orders o
where c.id = o.c_id and o.odate between '01.01.2005' and '01.02.2005'


ID NAME
3 ИП Сидоров И.И.
1 AllInOne
1 AllInOne

В данном случае c.id = o.c_id является условием объединения клиентов и заказов, а o.odate between ... - условием "фильтрации" результата по дате заказов.