powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Создание таблицы контрагентов
25 сообщений из 59, страница 1 из 3
Создание таблицы контрагентов
    #36443010
blest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть сущность контрагент - есилф физлицо, то нужно вносить Фамилию, Имя, Отчество - 3 поля. Если юрлицо, то 1 поле - название контрагента. Можно сделать одной таблицей, с четырмя полями. В первом случае будет заполняться одно поле, во втором другие 3 поля. Насколько это правильно и стоит ли так делать?
...
Рейтинг: 0 / 0
Создание таблицы контрагентов
    #36443539
Toshik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В таком случае разбивают на три таблицы.
...
Рейтинг: 0 / 0
Создание таблицы контрагентов
    #36443561
Naf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А есть еще ИНН, как бы общий, но разной длины и у физлиц необязательный, а у юр - обязательный (в РФ).
С уважением, Naf
...
Рейтинг: 0 / 0
Создание таблицы контрагентов
    #36444202
blest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.е. я так понимаю основная таблица - контрагенты, содержащая внешний ключ на таблицу физ.лицо и вн.ключ на таблица юр.лицо?
...
Рейтинг: 0 / 0
Создание таблицы контрагентов
    #36444216
Naf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blestТ.е. я так понимаю основная таблица - контрагенты, содержащая внешний ключ на таблицу физ.лицо и вн.ключ на таблица юр.лицо? у них внешние ключи могут совпадать с примарными
...
Рейтинг: 0 / 0
Создание таблицы контрагентов
    #36444509
И направлены в другую сторону - к контрагенту
...
Рейтинг: 0 / 0
Создание таблицы контрагентов
    #36444641
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blestНасколько это правильно и стоит ли так делать?

Это неправильно концептуально. В информационной модели так делать не следует. В противном случае вам придётся написать объёмный комментарий к такой сущности.

Если речь идёт о реализации, то оракл именно так и поступает, но внутри себя. На уровне SQL запросов пользователь получает из таблицы объекты разных типов, с разным набором полей. Но впринципе это сокрытие несущественно. Реализация не сложная и достаточно "прозрачная" для пользователей БД. Можно и без объектной надстройки обойтись.
...
Рейтинг: 0 / 0
Создание таблицы контрагентов
    #36445340
blest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
------------------------И направлены в другую сторону - к контрагенту

А ну да, как раз таблицы юр.лицо и физ.лицо должны ссылать на контрагенты.
...
Рейтинг: 0 / 0
Создание таблицы контрагентов
    #36445565
Toshik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blest[quot ------------------------]И направлены в другую сторону - к контрагенту

А ну да, как раз таблицы юр.лицо и физ.лицо должны ссылать на контрагенты.[/quot

ага
...
Рейтинг: 0 / 0
Создание таблицы контрагентов
    #36446235
sp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NafА есть еще ИНН, как бы общий, но разной длины и у физлиц необязательный, а у юр - обязательный (в РФ).
С уважением, Naf

а еще бывают такие неуникальные случаи изменения ИНН и бывают их кучи одинаковых!!! )))
в украине все возможно ))))
...
Рейтинг: 0 / 0
Создание таблицы контрагентов
    #36458238
blest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Toshikblest[quot ------------------------]И направлены в другую сторону - к контрагенту

А ну да, как раз таблицы юр.лицо и физ.лицо должны ссылать на контрагенты.[/quot

ага

Еще один момент. Таблицы будут такого вида:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
table Контрагенты (
   ID Контрагента, (pk)
   <атрибуты Контрагента>
);

table Физ_Лица (
   ID Контрагента, (pk)
   <атрибуты Физ_Лицо>
);

table ЮР_Лица (
   ID Контрагента, (pk)
   <атрибуты ЮР_Лицо>
);

Но как будет гарантироваться целостность БД? Контрагент может быть или Юр.лицом или Физ.лицом. Но по такой схеме в таблицах Юр.лица и Физ.лица айдишники контрагентов могут совпадать. Что делать?
...
Рейтинг: 0 / 0
Создание таблицы контрагентов
    #36458340
Считать их предпринимателями без образования юридического лица :)

А если серьезно, то очень редки ситуации, когда с помощью только первичных ключей и констрейнтов можно задать все реально имеющиеся ограничения.
Даже то, что актив равен пассиву.
...
Рейтинг: 0 / 0
Создание таблицы контрагентов
    #36458389
blest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-----------------------------Считать их предпринимателями без образования юридического лица :)

А если серьезно, то очень редки ситуации, когда с помощью только первичных ключей и констрейнтов можно задать все реально имеющиеся ограничения.
Даже то, что актив равен пассиву.

А какими еще средствами тогда можно еще пользоваться?
...
Рейтинг: 0 / 0
Создание таблицы контрагентов
    #36458695
carper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
blest,

Я бы не стал экономить место на текстовых атрибутах для справочника контрагентов, если он у вас не на сотни тысяч человек, то экономия получится грошовой, а структура базы усложнится.

Вообще соотношений типа (1:1) OR (1:1) лучше избегать.

Но дело ваше.

Попробуйте сделать так (псевдокод, проверять некогда)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
  "Главная таблица"
  create table contractors(ID NUMBER,  TYPE_C  CHAR( 1 )  not null
      constraint CKC_TYPE check (TYPE_C in ('0','1')), ...

  На этой таблице создаем PK на ID + TYPE_C

  "Юрики"
   create table c_lawyer(ID_CONTRACTORS NUMBER,  TYPE_C       CHAR( 1 )  not null
      constraint CKC_TYPE check (TYPE_C in ('0')), ...

  На этой таблице создаем FK на ID_CONTRACTORS + TYPE_C


   "Физики"
   create table c_private(ID_CONTRACTORS NUMBER,  TYPE_C       CHAR( 1 )  not null
      constraint CKC_TYPE check (TYPE_C in ('1')), ...
    
    На этой таблице также создаем FK на ID_CONTRACTORS + TYPE_C

Теперь вы никак не сможете вставить запись из contractors с одним же и тем же ID + TYPE_C сразу в разные таблицы, за этим проследит поле TYPE_C, точнее constraints в подчиненных таблицах.

Минус в том, что constraints можно отключать, но и FK тоже можно удалять. :)

В принципе можно изощряться в этом направлении сколько душе угодно, например, генерировать значения последовательности для ID первичной таблицы из двух разных диапазонов (в зависимости от типа контрагента) и вставить в constraints подчиненных таблиц проверку на эти диапазоны, тогда не понадобится составной ключ, ну и т.д и т.п.
...
Рейтинг: 0 / 0
Создание таблицы контрагентов
    #36458706
sp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blestToshikblest[quot ------------------------]И направлены в другую сторону - к контрагенту

А ну да, как раз таблицы юр.лицо и физ.лицо должны ссылать на контрагенты.[/quot

ага

Еще один момент. Таблицы будут такого вида:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
table Контрагенты (
   ID Контрагента, (pk)
   <атрибуты Контрагента>
);

table Физ_Лица (
   ID Контрагента, (pk)
   <атрибуты Физ_Лицо>
);

table ЮР_Лица (
   ID Контрагента, (pk)
   <атрибуты ЮР_Лицо>
);

Но как будет гарантироваться целостность БД? Контрагент может быть или Юр.лицом или Физ.лицом. Но по такой схеме в таблицах Юр.лица и Физ.лица айдишники контрагентов могут совпадать. Что делать?

генерировать ID только в table Контрагенты сначала и вставлять в соответствующие таблицы Физ_Лица и ЮР_Лица
...
Рейтинг: 0 / 0
Создание таблицы контрагентов
    #36458756
blest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
spblestToshikblest[quot ------------------------]И направлены в другую сторону - к контрагенту

А ну да, как раз таблицы юр.лицо и физ.лицо должны ссылать на контрагенты.[/quot

ага

Еще один момент. Таблицы будут такого вида:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
table Контрагенты (
   ID Контрагента, (pk)
   <атрибуты Контрагента>
);

table Физ_Лица (
   ID Контрагента, (pk)
   <атрибуты Физ_Лицо>
);

table ЮР_Лица (
   ID Контрагента, (pk)
   <атрибуты ЮР_Лицо>
);

Но как будет гарантироваться целостность БД? Контрагент может быть или Юр.лицом или Физ.лицом. Но по такой схеме в таблицах Юр.лица и Физ.лица айдишники контрагентов могут совпадать. Что делать?

генерировать ID только в table Контрагенты сначала и вставлять в соответствующие таблицы Физ_Лица и ЮР_Лица

Ну я так и собирался делать в процедуре по добавлению контрагентов, но это ведь не гарантирует, что другой программист взяв эти таблицы не напихает в Юр.лица и Физ.лица одинаковые айдишники
...
Рейтинг: 0 / 0
Создание таблицы контрагентов
    #36458775
Фотография proposed amendment
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blestно это ведь не гарантирует, что другой программист взяв эти таблицы не напихает в Юр.лица и Физ.лица одинаковые айдишники

а что страшного случится если напихает? ты же не собираешься их использовать без базового ENTRY_ID?

никого не пугает что в таблицах PRODUCTS и DOCUMENTS могут быть одинаковые <RECORD>_ID а вот одинаковые ENTITY_ID и IDENTITY_ID беспокоят

почему?
...
Рейтинг: 0 / 0
Создание таблицы контрагентов
    #36458778
blest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
carperblest,

Я бы не стал экономить место на текстовых атрибутах для справочника контрагентов, если он у вас не на сотни тысяч человек, то экономия получится грошовой, а структура базы усложнится.

Вообще соотношений типа (1:1) OR (1:1) лучше избегать.

Но дело ваше.

Попробуйте сделать так (псевдокод, проверять некогда)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
  "Главная таблица"
  create table contractors(ID NUMBER,  TYPE_C  CHAR( 1 )  not null
      constraint CKC_TYPE check (TYPE_C in ('0','1')), ...

  На этой таблице создаем PK на ID + TYPE_C

  "Юрики"
   create table c_lawyer(ID_CONTRACTORS NUMBER,  TYPE_C       CHAR( 1 )  not null
      constraint CKC_TYPE check (TYPE_C in ('0')), ...

  На этой таблице создаем FK на ID_CONTRACTORS + TYPE_C


   "Физики"
   create table c_private(ID_CONTRACTORS NUMBER,  TYPE_C       CHAR( 1 )  not null
      constraint CKC_TYPE check (TYPE_C in ('1')), ...
    
    На этой таблице также создаем FK на ID_CONTRACTORS + TYPE_C

Теперь вы никак не сможете вставить запись из contractors с одним же и тем же ID + TYPE_C сразу в разные таблицы, за этим проследит поле TYPE_C, точнее constraints в подчиненных таблицах.

Минус в том, что constraints можно отключать, но и FK тоже можно удалять. :)

В принципе можно изощряться в этом направлении сколько душе угодно, например, генерировать значения последовательности для ID первичной таблицы из двух разных диапазонов (в зависимости от типа контрагента) и вставить в constraints подчиненных таблиц проверку на эти диапазоны, тогда не понадобится составной ключ, ну и т.д и т.п.

Ну да, это есть вариант.
...
Рейтинг: 0 / 0
Создание таблицы контрагентов
    #36462010
blestЕсть сущность контрагент - есилф физлицо, то нужно вносить Фамилию, Имя, Отчество - 3 поля. Если юрлицо, то 1 поле - название контрагента. Можно сделать одной таблицей, с четырмя полями. В первом случае будет заполняться одно поле, во втором другие 3 поля. Насколько это правильно и стоит ли так делать?

Есть 3 классических варианта решения вопроса:

1) 1 таблица (супертаблица): Контрагенты
Достоинства: простота в понимании
Недостатки: несколько пониженная надежность (проблема сделать так чтобы ООО "Рога и копыта" не стало директором ОАО "МММ")

2) 2 таблицы: Юрики и Физики. Вариант тупой ибо ссылочная целостность не реализуема вообще. Рассматривать не будем ибо юзать этот вариант не профессионально. )))

3) 3 таблицы: Контрагенты (содержащие общие для физиков и юриков поля), Юрики и Физики содержащие специфические поля.
Достоинства: надежность и правильность с точки зрения теории
Недостатки: несколько большая сложность в реализации по сравнению с в.1

P.S. Я когда-то у Алекса Усова из ru.delphi.db спросил примерно тоже самое.... году эдак в 1997-1998. )))
...
Рейтинг: 0 / 0
Создание таблицы контрагентов
    #36462536
LSV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Алексей Статюха

К контрагенту должен прилагаться набор некоторых реквизитов (сколь угодно разных).
Какая проблема разделить реквизиты на:
1. Для всех.
2. Для Юр.
3. Для Физ.
и т.д.

??

Решение: Таблица контрагентов, таблица реквизитов, таблица настроек.

Разновидностей контрагентов может быть гораздо больше, чем Юр и Физ. Зависит от задачи.

ЗЫ: Отдельные таблицы для Физ. и Юр. - идиотство. Тоже самое для Поставщик-Покупатель.

Точка. Дальше можно не обсуждать.
...
Рейтинг: 0 / 0
Создание таблицы контрагентов
    #36463275
sp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LSV2 Алексей Статюха

К контрагенту должен прилагаться набор некоторых реквизитов (сколь угодно разных).
Какая проблема разделить реквизиты на:
1. Для всех.
2. Для Юр.
3. Для Физ.
и т.д.

??

Решение: Таблица контрагентов, таблица реквизитов, таблица настроек.

Разновидностей контрагентов может быть гораздо больше, чем Юр и Физ. Зависит от задачи.

ЗЫ: Отдельные таблицы для Физ. и Юр. - идиотство. Тоже самое для Поставщик-Покупатель.

Точка. Дальше можно не обсуждать.

Тоесть по-Вашему это верно когда есть расплывчатое поле Название которое в одной этой таблице и название Юрика и если че - ФИО ????? !!!
...
Рейтинг: 0 / 0
Создание таблицы контрагентов
    #36463549
LSV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
spТоесть по-Вашему это верно когда есть расплывчатое поле Название которое в одной этой таблице и название Юрика и если че - ФИО ????? !!!По моему подобный вопрос нужно формулировать точнее. :)
Совпадение ФИО и названия для Физ. - тавтология. Ничего не поделаешь.
Но ничего страшного тут не вижу.
Предлагаете для этого завести отдельную таблицу ? А еще для 20..50 других свойств ?
...
Рейтинг: 0 / 0
Создание таблицы контрагентов
    #36463601
Silverlight
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LSVspТоесть по-Вашему это верно когда есть расплывчатое поле Название которое в одной этой таблице и название Юрика и если че - ФИО ????? !!!По моему подобный вопрос нужно формулировать точнее. :)
Совпадение ФИО и названия для Физ. - тавтология. Ничего не поделаешь.
Но ничего страшного тут не вижу.
Предлагаете для этого завести отдельную таблицу ? А еще для 20..50 других свойств ?
И дать этой таблице название Dustbin(мусорное ведро)
...
Рейтинг: 0 / 0
Создание таблицы контрагентов
    #36463823
Фотография iscrafm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LSV
Совпадение ФИО и названия для Физ. - тавтология. Ничего не поделаешь.

это не тавтология, это недопонимание различия между понятиями "данные" и "информация", или физической и логической моделью. Данные - это 250 символов, а информация - в одном случае ФИО человека, в другом - наименование компании. Вы правы, ничего сверхестественного.
...
Рейтинг: 0 / 0
Создание таблицы контрагентов
    #36464242
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Статюха3) 3 таблицы: Контрагенты (содержащие общие для физиков и юриков поля), Юрики и Физики содержащие специфические поля.
Достоинства: надежность и правильность с точки зрения теории
Недостатки: несколько большая сложность в реализации по сравнению с в.1А если к общей таблице прилепить ссылки на специфические таблицы и ограничение что заполнена (not null) может быть только одна ссылка, то мы вернемся к варианту 1 в виде вьюхи.
...
Рейтинг: 0 / 0
25 сообщений из 59, страница 1 из 3
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Создание таблицы контрагентов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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