powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Вопрос по SQL и организации струтуры БД в Firebird
11 сообщений из 11, страница 1 из 1
Вопрос по SQL и организации струтуры БД в Firebird
    #32526032
Dimitrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Задача: необходимо хранить информацию об адресах и телефонах(телефонов в каждом адресе несколько, есть факсы.

Вариант 1: в таблице адресов создать поле TEL и хранить все телефоны через запятую. Если факс - ставить перед номером букву "ф.". (А если нужно будет выбрать только телефоны или только факсы или выбрать не больше двух телефонов по каждому адресу? В принципе наверно можно будет с LIKE ф.% извратиться или со строками поработать... Но хочется оптимальный вариант выбрать)

Вариант 2(больше нравится, с ним проблема):
хранить таблицу адресов и таблицу телефонов(каждая запись(телефон) соответствует какому-то адресу).

Проблема: если делать обычный select то сколько у адреса телефонов, столько раз этот адрес и будет дублироваться. Это некрасиво. Можно ли как нибудь или "*" повторяющиеся адреса забить или сделать чтобы в результатах запроса телефоны в какие нибудь вычисляемые столбцы выводились(в ширину)?

Или можно написать триггер Update для таблицы телефонов, который бы обновлял другую таблицу, содержащую в каждой строке все телефоны соответствующие какому либо адресу через запятую:

tel
code|addr|telnum
1 | 1 |121212
2 | 1 |232323
3 | 2 |555555
4 | 2 |666666
5 | 3 |111111

mirrortel
code|addr|telnum
1 | 1 |121212,232323,55555
2 | 2 |55555,66666
3 | 3 |111111

возможно ли это в триггере сделать?

Может еще варианты есть. Посоветуйте как быть.
...
Рейтинг: 0 / 0
Вопрос по SQL и организации струтуры БД в Firebird
    #32526172
vis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а какого типа выборки будут нужны?

рискну предложить усовершенствованный 3-й вариант:

address(id,name,phones)
phone(id,address_id,name)

и при изменении таблицы обновлять address.phones
...
Рейтинг: 0 / 0
Вопрос по SQL и организации струтуры БД в Firebird
    #32526300
doroshka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А я бы сделал так

Код: plaintext
1.
2.
3.
adress(id,name)

contacts(id,addr_id,number,type)

В поле type будет храниться тип контакта - дом. тел., раб. тел., факс, моб. тел., e-mail и т.п.

С выборкой только факса или только какого-то типа контактов - проблем не будет. Если надо выбирать все контакты, и при этом они должны быть через запятую в строчке, то это, по-моему, надо делать на клиенте (в смысле склеивать их в одну строчку).
Хотя, как правильно спросил vis, все зависит от того какие выборки будут...
...
Рейтинг: 0 / 0
Вопрос по SQL и организации струтуры БД в Firebird
    #32526432
Dik76
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вариант 2(больше нравится, с ним проблема):
хранить таблицу адресов и таблицу телефонов(каждая запись(телефон) соответствует какому-то адресу).

Проблема: если делать обычный select то сколько у адреса телефонов, столько раз этот адрес и будет дублироваться. Это некрасиво. Можно ли как нибудь или "*" повторяющиеся адреса забить или сделать чтобы в результатах запроса телефоны в какие нибудь вычисляемые столбцы выводились(в ширину)?

adr(id_adr, address)
phone(id_adr, type, num)

можно написать ХП которая развернет телефоны для указанного id_adr в строку, а потом

select a.address, ХП(a.id_adr)
from adr
...
Рейтинг: 0 / 0
Вопрос по SQL и организации струтуры БД в Firebird
    #32526438
Dik76
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пардон

select a.address, ХП(a.id_adr)
from adr a
...
Рейтинг: 0 / 0
Вопрос по SQL и организации струтуры БД в Firebird
    #32526721
Dimitrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Насколько я понимаю, алгоритм ХП будет такой:

1. Взять id і-го адреса
2. Выбрать все телефоны соответсвующие ему.
3. В цикле слепить их в некоторую строковую переменную
4. Вернуть эту переменную

Я не знаю синтаксиса ХП. Где его можно прочитать?
...
Рейтинг: 0 / 0
Вопрос по SQL и организации струтуры БД в Firebird
    #32527316
Klick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А может все таки на клиенте в программе это сделать? Дополнительным запросом? И выводить данные эти оттдельно.
...
Рейтинг: 0 / 0
Вопрос по SQL и организации струтуры БД в Firebird
    #32527377
Серега
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Dimitrik
А зачем нужны эти телефоны/факсы? Если надо автоматически дозваниваться до абонента и железным голосом говорить ему всякие гадости, тогда второй вариант, да еще с наворотами. Если секретарше (или кому еще) для справки - первого за глаза хватит, и нефига извращаться. 8-)
...
Рейтинг: 0 / 0
Вопрос по SQL и организации струтуры БД в Firebird
    #32527386
Dik76
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ХП что-то вроде этого:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
CREATE PROCEDURE PHONE_SEL (
    ID_ADR INTEGER)
RETURNS (
    PHONES VARCHAR( 1500 ))
AS
DECLARE VARIABLE NUM VARCHAR( 16 );
BEGIN
  PHONES = '';

  FOR
    SELECT TYPE_NUM||'.'||NUM
      FROM PHONE
     WHERE ID_ADR = :ID_ADR
      INTO :NUM
  DO
  BEGIN
    IF (PHONES = '') THEN
      PHONES = :NUM;
    ELSE
      PHONES = PHONES || ', ' ||NUM;
  END

  SUSPEND;
END;

где TYPE_NUM: 'т', 'ф', а лучше сделать справочник..
...
Рейтинг: 0 / 0
Вопрос по SQL и организации струтуры БД в Firebird
    #32527848
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
BEGIN
  FOR SELECT TYPE_NUM
        FROM PHONE
        WHERE ID_ADR = :ID_ADR
        INTO :NUM
  DO PHONES = PHONES || ', ' ||NUM;
  SUSPEND;
END;
...
Рейтинг: 0 / 0
Вопрос по SQL и организации струтуры БД в Firebird
    #32528657
Dimitrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
спасибо за помощь!
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Вопрос по SQL и организации струтуры БД в Firebird
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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