Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.10.2023, 20:02   #1
Sundersson
Новичок
Джуниор
 
Регистрация: 31.10.2023
Сообщений: 3
По умолчанию Создание структуры БД: договор, физлица, юрлица. Как связать?

Подскажите новичку куда копать при создании структуры базы данных.
Есть три таблицы:
Договор
Клиенты физические лица
Клиенты юридические лица
Как создать связь, чтобы в договоре можно было выбирать или клиента физлицо или клиента юрлицо?
Если делать одну общую таблицу клиенты, содержащую информацию и о физлицах, и о юрлицах, то она получается громоздкая и много пустых полей.
Может есть другая, правильная реализация?
Sundersson вне форума Ответить с цитированием
Старый 31.10.2023, 20:21   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Сделайте таблицу связей ид, ид физ, ид юр
p51x вне форума Ответить с цитированием
Старый 01.11.2023, 01:14   #3
Steelcraft
Форумчанин
 
Регистрация: 13.03.2023
Сообщений: 111
По умолчанию

Когда-то я много работал с реляционными базами данных и часто сталкивался с подобной ситуацией. Использовал нотацию IDEF1X и отношение категоризации. Попробуйте поискать в этом направлении.
Steelcraft вне форума Ответить с цитированием
Старый 01.11.2023, 09:17   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

два поля ссылки
1 -- на юр. лица
2 -- на физ. лица
заполняется одно из...
можно в отдельной таблице
+ поле ссылка на договор
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Старый 01.11.2023, 12:05   #5
Valick
Форумчанин
 
Регистрация: 27.04.2022
Сообщений: 493
По умолчанию

1 таблица Клиенты
id - идентификатор строки (идентификатор клиента)
type_id - тип клиента
(далее общие поля для клиентов не зависищие от типа)

2 таблица Тип клиента
id - идентификатор строки (идентификатор типа)
name - Наименование типа (юр лицо , физ лицо)
(далее поля специфические для типа клиентов)

3 таблица Юр клиенты
id - идентификатор строки
client_id - идентификатор клиента из таблицы Клиенты
(далее поля специфичные для юр клиентов)

4 таблица Физ клиенты
id - идентификатор строки
client_id - идентификатор клиента из таблицы Клиенты
(далее поля специфичные для физ клиентов)

5 таблица Договор
id - идентификатор строки
code - номер/код договора
client_id - идентификатор клиента
Valick вне форума Ответить с цитированием
Старый 01.11.2023, 16:17   #6
Steelcraft
Форумчанин
 
Регистрация: 13.03.2023
Сообщений: 111
По умолчанию

Целесообразно еще в таблицах юр и физ ввести составной внешний ключ по полям id+type_id таблицы клиентов. Дополнительный контроль целостности (не позволит юрам ссылаться на записи для физов и наоборот).

Вообще такие ситуации очень хорошо разруливают всякие CASE для разработки баз данных (например, erwin). Помнится, он сразу генерировал скрипты для таблиц, представлений, индексов, ограничений, хранимых процедур CRUD etc. Избавляет от большого объема ручной работы и облегчает модификацию/сопровождение.
Steelcraft вне форума Ответить с цитированием
Старый 01.11.2023, 17:43   #7
Valick
Форумчанин
 
Регистрация: 27.04.2022
Сообщений: 493
По умолчанию

Цитата:
Сообщение от Steelcraft Посмотреть сообщение
Целесообразно еще в таблицах юр и физ ввести составной внешний ключ по полям id+type_id таблицы клиентов.
Не вижу выгоды. В таблице физиков все type_id будут например 1, в таблице юриков все type_id будут 2.
Valick вне форума Ответить с цитированием
Старый 01.11.2023, 18:12   #8
Steelcraft
Форумчанин
 
Регистрация: 13.03.2023
Сообщений: 111
По умолчанию

Цитата:
Сообщение от Valick Посмотреть сообщение
В таблице физиков все type_id будут например 1, в таблице юриков все type_id будут 2.
Будут или должны быть? Это далеко не одно и то же.

Таблица физ ссылается на внешний ключ client_id из таблицы Клиенты, но это всего лишь число. Ничто не мешает ошибочно занести в таблицу физ ключ записи клиента, который на самом деле юр.

На составной ключ можно наложить constraint, и тогда SQL сервер просто не примет такую ошибочную транзакцию. Хороший код должен защищать целостность данных.
Steelcraft вне форума Ответить с цитированием
Старый 02.11.2023, 11:40   #9
Sundersson
Новичок
Джуниор
 
Регистрация: 31.10.2023
Сообщений: 3
По умолчанию

Цитата:
Сообщение от Steelcraft Посмотреть сообщение
Когда-то я много работал с реляционными базами данных и часто сталкивался с подобной ситуацией. Использовал нотацию IDEF1X и отношение категоризации. Попробуйте поискать в этом направлении.
Спасибо, очень помогло!


Цитата:
Сообщение от Steelcraft Посмотреть сообщение
Целесообразно еще в таблицах юр и физ ввести составной внешний ключ по полям id+type_id таблицы клиентов. Дополнительный контроль целостности (не позволит юрам ссылаться на записи для физов и наоборот).
а можно поподробнее?
Sundersson вне форума Ответить с цитированием
Старый 02.11.2023, 11:51   #10
Sundersson
Новичок
Джуниор
 
Регистрация: 31.10.2023
Сообщений: 3
По умолчанию

Цитата:
Сообщение от Valick Посмотреть сообщение
1 таблица Клиенты
id - идентификатор строки (идентификатор клиента)
type_id - тип клиента
(далее общие поля для клиентов не зависищие от типа)
...
спасибо за подробный пример таблиц
Sundersson вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
договор подряда ts-alan Свободное общение 19 09.05.2015 23:15
открыть договор yuresku Microsoft Office Excel 2 19.05.2014 01:45
BPwin - Договор с поставщиком. wert696 Помощь студентам 0 22.03.2013 08:47
Договор WizarD.89 Microsoft Office Word 3 16.01.2011 20:07
Как создать защищенный договор bigfoot Microsoft Office Word 1 27.12.2009 01:37