Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как правильно организовать связь между таблицами [D6, XP]


Новичок ©   (2007-11-12 18:13:00) 

Есть таблица /список физ.клиентов/ с полем Телефон
Есть таблица /список организаций/ с полем Телефон
Есть таблица /список телефонов/ с полем Телефон

Так вот мне хотелось бы связать  эти таблицы, чтобы телефоны заносились в одну таблицу /список телефонов, по уникальному значению ИД клиентов, а поля телефон из двух первых таблиц убрать.

У меня вопрос, можно ли подчинить одну таблицу телефонов двум таблицам /физ.клиенты и организации/ ?

Если нет, то как правильно это сделать ?


Новичок   (2007-11-13 21:36:00) [1]

Так нагляднее:

procedure TDataModule1.Table1BeforePost(DataSet: TDataSet);
begin
 table1.FieldByName('LastModify').AsDateTime:=Now;
end;


> Anatoly Podgoretsky ©   (13.11.07 19:12) [16]
> Имелось в виду ID (Integer, PK), PhoneNumber(varchar), Rem(Text/Memo)

Еще раз спасибо


Новичок   (2007-11-13 21:24:00) [2]

еще один вопрос. Как сделать TIMESTAMP при сохранения записи.

В парадоксе это просто :

TABLE1.BEFOREPOST
BEGIN  
  TABLE1.TIMESTAMP:=NOW;
END;


Anatoly Podgoretsky   (2007-11-13 19:12:00) [3]

Имелось в виду ID (Integer, PK), PhoneNumber(varchar), Rem(Text/Memo)


Новичок   (2007-11-13 19:02:00) [4]


> Anatoly Podgoretsky ©   (13.11.07 11:30) [13]

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

> Anatoly Podgoretsky ©   (13.11.07 11:31) [14]

Уже нашел


Anatoly Podgoretsky   (2007-11-13 11:31:00) [5]

Найди информацию по нормальным формам, иначе у тебя получится (уже есть) уродец, трудно управляемый, с аномалиями.


Anatoly Podgoretsky   (2007-11-13 11:30:00) [6]


> TEL_CODE уникальное значение записи благодаря триггеру (лишнее
> ?!)

Как раз самое нужное, только обычно это называют ID
А вот TEL_TYPE как раз лишнее, особенно если расматривать вариант, что телефон может принадлежать не одному лицу, в том числе возможен вариант, что это и организация и частное лицо. Принадлежность в таблице телефонов вообще быть не должно, это делается в другом направление или от клиента к телефонам, или таблица Многие ко многим, что правильнее.

> TEL_ROD_CODE - уникальное значение записи благодаря триггеру
> TEL_SUB - дополнительный номер для МиниАТС

Эти поля вообще не понятны, какой еще ROD, а TEL_SUB это часть номера, а не отдельный номер. То есть таблицу можно уменьшить до двух полей ID и REM


ЮЮ   (2007-11-13 11:10:00) [7]

> TEL_TYPE - здесь 0 - организация, 1 - физ.лицо
> TEL_ROD_CODE - уникальное значение записи благодаря триггеру
> TEL_SUB - дополнительный номер для МиниАТС
> TEL_REM - краткое описание КРТ
> TEL_CODE уникальное значение записи благодаря триггеру (лишнее
> ?!)

Ну вот, не телефонная станция :(

C такими атрибутами не стоит порождать сущность, которой нет. Т.е. надобности в такой таблице нет. А поле Телефон из Клиенты/Организации вынести в другую таблмцу исключительно для связи один ко многим. [5]

А причиной того, что таких таблиц получается 2 - одна для физ лиц, другая - для организаций, возможная ошибка в проектировании (не был выделен общий предок для этих двух сущностей).


Новичок   (2007-11-13 10:55:00) [8]


> TEL_ROD_CODE - уникальное значение записи благодаря триггеру

забыл дописать: внешней таблицы


Новичок   (2007-11-13 10:54:00) [9]


> тогда поле Телефон из таблицы Клиент и впрямь можно убрать

Правильно понял.


> Правда по идентификаторов полей фиг поймещь, что они значат.


TEL_TYPE - здесь 0 - организация, 1 - физ.лицо
TEL_ROD_CODE - уникальное значение записи благодаря триггеру
TEL_SUB - дополнительный номер для МиниАТС
TEL_REM - краткое описание КРТ
TEL_CODE уникальное значение записи благодаря триггеру (лишнее ?!)


ЮЮ   (2007-11-13 10:39:00) [10]

> Каюсь не уточнил. В таблице телефонов есть поле отвечающее
> за название (код) внешней таблицы.


Это уже серьезнее, чем просто номер. Это уже на телефонную станцию похоже. :) Правда по идентификаторов полей фиг поймещь, что они значат.


> Так вот мне хотелось бы связать  эти таблицы, чтобы телефоны
> заносились в одну таблицу /список телефонов, по уникальному
> значению ИД клиентов, а поля телефон из двух первых таблиц
> убрать.

Учитывая, что PRIMARY KEY ("TEL_PHONE"), то поля телефон в двух первых таблицах и есть поле связи с таблицей TEL_LIST, т.е. один телефон может быть у многих клиентов и организаций. Если ты хочешь организовать связь многие ко многим, то нужны отдельные таблицы см[5] c полями Клиент и Телефон, тогда поле Телефон из таблицы Клиент и впрямь можно убрать


Новичок   (2007-11-13 10:26:00) [11]


> Тут не с телефонов надо начинать, а с таблиц - разделение
> на физических лиц и организации уже не позволит делать нужное
> - поиск по номеру телефона.

Каюсь не уточнил. В таблице телефонов есть поле отвечающее за название (код) внешней таблицы.

Приведу таблицу.
CREATE TABLE "TEL_LIST"
(
 "TEL_PHONE" VARCHAR(16) CHARACTER SET WIN1251 NOT NULL,
 "TEL_ROD_CODE" INTEGER NOT NULL,
 "TEL_REM" VARCHAR(25) CHARACTER SET WIN1251 NOT NULL,
 "TEL_TYPE" SMALLINT,
 "TEL_CODE" INTEGER,
 "TEL_SUB" SMALLINT,
PRIMARY KEY ("TEL_PHONE")
);


Anatoly Podgoretsky   (2007-11-13 09:11:00) [12]

Тут не с телефонов надо начинать, а с таблиц - разделение на физических лиц и организации уже не позволит делать нужное - поиск по номеру телефона.


> чтобы телефоны заносились в одну таблицу /список телефонов,
>  по уникальному значению ИД клиентов

И это тоже неверно, не по ИД клиентов надо связывать, а клиентов по ИД телефона. К клиента может быть более одного телефона и телефон может относиться более чем к одному клиенту. Так потребуется еще и организация связи Многие ко Многим.


> У меня вопрос, можно ли подчинить одну таблицу телефонов
> двум таблицам /физ.клиенты и организации/ ?

Если сделать как я написал, то можно но не нужно. Найти одним простым запросом принадлежность телефона клиенту будет нельзя.


Sergey13   (2007-11-13 08:16:00) [13]

А я бы еще подумал над объединением первых двух таблиц - возможно здорово облегчит жизнь в дальнейшем.


ЮЮ   (2007-11-13 06:25:00) [14]

> Есть таблица /список физ.клиентов/ с полем Телефон
> Есть таблица /список организаций/ с полем Телефон

Во-первых, у физ.клиента, не говоря уж об организации, запросто может быть несколько телефонов.
Поэтому это д.б. не поле Телефон, а таблицы ТелефоныКлиентов и ТелефоныОрганизаций со связью один ко многим с
Клиенты и Организации, соответственно.


> Есть таблица /список телефонов/ с полем Телефон

Это имело бы смысл, если бы это было объектом предметной оласти, т.е. ты реально "создавал" номера телефонов и распределял их Клиентам и Организациям. А так номер телефона - просто атрибут.


> Пример: зная телефон я могу найти клиента или организацию.
> С Мемо такое возможно ?

Если клиентов и органицаций не очень много и полный скан таблицы не смущает, то - ради бога.
Почему сразу Мемо? VarChara не хватит?


Новичок   (2007-11-12 22:50:00) [15]

Мастера поделитесь мненией, как бы вы поступили. Использовать Мемо или таблицу. Кроме этого я хочу использовать таблицу телефонов для обратного поиска.
Пример: зная телефон я могу найти клиента или организацию. С Мемо такое возможно ?

Заранее спасибо.


vpbar   (2007-11-12 21:46:00) [16]

можно вроде


Новичок   (2007-11-12 21:03:00) [17]


> Одно мемо поле в каждой таблице и в нем список телефонов.
>
> Третью таблицу удалить.

Не плохо. Тогда вопрос:
в Мемо можно отследить повтор одинакового телефона. 3-я таблица сортировалась по телефону и если повтор то просто ссылка на существующий.


Reindeer Moss Eater   (2007-11-12 18:22:00) [18]

Это оптимизация ради оптимизации.
Одно мемо поле в каждой таблице и в нем список телефонов.
Третью таблицу удалить.


Наверх

Титульная страница Поиск, карта сайта Написать письмо