Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Одно поле ссылается на несколько разных таблиц, Одно поле ссылается на несколько разных  
:(
    Опции темы
Grandpa
Дата 5.7.2008, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 24.7.2003
Где: Одесса

Репутация: нет
Всего: нет



Пусть имеется две таблицы - Клиенты и Экспедиторы. Информация в них разная. Третья таблица Связь должна хранить списки телефонов для Клиентов и Экспедиторов. В ней есть поле Персона, в котором находится ключ либо к одной, либо к другой таблицы.
При такой схеме нарушается целостность данных.
Я нашёл два варианта решения:
  • для каждой из таблиц Клиенты, Экспедиторы создать свою таблицу Связь
  • снять проверку на целостьность данных и  обеспечить уникальность ключей таблиц Клиенов и Экспедиторов. Этот вариант демонстрируется в прикрепленном файле.

И то и другое решение кажутся мне корявыми. Первое множит количество таблиц (ещё есть Сотрудники, ОднократноПривлекаемые и т.п. и у всех есть телефоны  smile ). Второе чревато в смысле маштабируемости - может случиться, что нельзя будет обеспечить уникальность ключей или ключи будут иметь разные типы данных.

Есть ли стандартный приём для решения таких проблем? Чуствую что есть, но хочется увидеть  smile .





Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  2.jpg 50,31 Kb
PM ICQ   Вверх
Magnifico
Дата 5.7.2008, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 23.1.2008
Где: Московская област ь

Репутация: 1
Всего: 17



Клиенты:
(
idClient PK
fio
CommunicationID  FK ------>Связь(CommunicationID)
)

Экспедиторы:
(
idExpeditor PK
fio
CommunicationID  FK ------>Связь(CommunicationID)
)

Связь
(
CommunicationID auto_increment  PK
PhoneNumber
)




--------------------
Всё  в  порядке   -   спасибо  зарядке  !
PM MAIL   Вверх
Grandpa
Дата 5.7.2008, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 24.7.2003
Где: Одесса

Репутация: нет
Всего: нет



Цитата(Magnifico @  5.7.2008,  12:09 Найти цитируемый пост)
Клиенты:
(
idClient PK
fio
CommunicationID  FK ------>Связь(CommunicationID)
)


Прошу прошения, не понял  smile . Здесь отношение 1:1? Но телефонов может быть несколько! А при одном телефоне проще сделать поле Телефон в Клиенте без таблице Связь.
По каким полям делается отношение (1 ко многим) между Клиентом (Экспедитором) и Связь ?

PM ICQ   Вверх
Magnifico
Дата 5.7.2008, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 23.1.2008
Где: Московская област ь

Репутация: 1
Всего: 17



а чего непонятного ?  каждой записи в таблицах Клиенты Экспедиторы
соттветсвует много значений из таблицы Связь

 smile не неправильно!
тем более что
Клиенты:
CommunicationID  FK 
и
Экспедиторы:
CommunicationID  FK
будут конфликтовать 

Это сообщение отредактировал(а) Magnifico - 5.7.2008, 20:52


--------------------
Всё  в  порядке   -   спасибо  зарядке  !
PM MAIL   Вверх
Grandpa
Дата 5.7.2008, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 24.7.2003
Где: Одесса

Репутация: нет
Всего: нет



Цитата(Magnifico @  5.7.2008,  14:59 Найти цитируемый пост)
каждой записи в таблицах Клиенты Экспедиторы
соттветсвует много значений из таблицы Связь


Для этого нужна такая структура

Клиенты:
(
idClient PK
fio
)

Экспедиторы:
(
idExpeditor PK
fio
)

Связь
(
CommunicationID auto_increment  PK
idClient _or_idExpeditor  FK    // Поле по которому устанавливается отношение один-ко-многим
PhoneNumber
)

Или я ошибаюсью. В чём?
PM ICQ   Вверх
Magnifico
Дата 5.7.2008, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 23.1.2008
Где: Московская област ь

Репутация: 1
Всего: 17



поля  CommunicationID  unique (если они совпадают с id клиета их их можно убрать),
ClientCommunicationID и ForwarderCommunicationID допускают null
сколько таблиц столько и полей в таблице Communication

 не работает ссылка
http://up.li.ru/files/2008/07/05/368869.GI...mmunication.GIF
http://picthost.ru/viewer.php?file=mk9tu5qgmfdhmy2b1b.gif



--------------------
Всё  в  порядке   -   спасибо  зарядке  !
PM MAIL   Вверх
Grandpa
Дата 5.7.2008, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 24.7.2003
Где: Одесса

Репутация: нет
Всего: нет



Вы просматривали рисунок в моём первом посте http://forum.vingrad.ru/act-Attach/type/post/id-1570470.html ? Обратите внимание, что связи "пунктирные", т.е. отключена проверка на целостность данных. Т.к. в поле person либо idClient, либо idForwarder, их значения разведены диапазоном.

Ваше решение тоже неплохое, но не кажется ли вам, что оно не согласуется с первой нормальной формой? Повторяющиеся поля. Да, я для простоты не указал ещё сотрудников фирмы, однократных заказчиков и т.п. Количество полей будет расти, расти...
PM ICQ   Вверх
Magnifico
Дата 6.7.2008, 08:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 23.1.2008
Где: Московская област ь

Репутация: 1
Всего: 17



вводим родительское поле parentID - идентификатор таблицы
клиенты -1
экспедиторы 2
сотрудники 3
.........
недостатки: придется отключить целстность (проверять на уровне кода триггеры,процедуры, клиетский код)
достоинства: минимум полей , свободный автоинкремент в каждой таблице

запись идентфицируется по двум полям CommuncationID и ParentID

http://ipicture.ru/Gallery/Viewfull/3148791.html

Цитата

оно не согласуется с первой нормальной формой?

наверно все таки с третьей значения в ячейках атомарны и зависят от первичного ключа




Это сообщение отредактировал(а) Magnifico - 6.7.2008, 09:05


--------------------
Всё  в  порядке   -   спасибо  зарядке  !
PM MAIL   Вверх
Grandpa
Дата 6.7.2008, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 24.7.2003
Где: Одесса

Репутация: нет
Всего: нет



Magnifico спасибо.  Вы позволили мне определиться. Буду использовать Ваш подход (http://up.li.ru/files/2008/07/05/368869.GIF;communication.GIF). Думаю тема закрыта.
Ещё раз спосибо.
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Общие вопросы по базам данных"
LSD
Zloxa

Данный форум предназначен для обсуждения вопросов о базах данных не попадающих под тематику других форумов:

  • вопросам по СУБД для которых нет отдельных подфорумов
  • вопросам которые затрагивают несколько разных СУБД (например проблема выбора)
  • инструменты для работы с СУБД
  • вопросы проектирования БД
  • теоретически вопросы о СУБД

Данный форум не предназначен для:

  • вопросов о поиске разлиных БД (если не понимаете чем БД отличается от СУБД то: а) вам не сюда; б) Google в помощь)
  • обсуждения проблем с доступом к СУБД из различных ЯП (для этого есть соответсвующие форумы по каждому ЯП)
  • обсуждения проблем с написание SQL запросов, для этого есть форум Составление SQL-запросов
  • просьб о написании курсовой, реферата и т.п., для этого есть Центр помощи или фриланс биржа
  • объявлений о найме специалистов, для этого есть раздел Объявления о найме специалистов

Если вы не соблюдаете эти правила, не удивляйтесь потом не найдя свою тему/сообщение. ;)


Полезные советы:

При написании сообщения постарайтесь дать теме максимально понятное название. В теме максимально подробно опишите проблему. Если применимо укажите: название базы данных и версии (MySQL 4.1, MS SQL Server 2000 и т.п.); используемых язык программирования; способа доступа (ADO, BDE и т.д.); сообщения об ошибках.

Для вставки кода используйте теги [code=sql] [/code].

Литературу по базам данных можно поискать здесь.

Действия модераторов можно обсудить здесь.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, LSD, Zloxa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | СУБД, общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0859 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.