Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Вопрос к проектировщикам  [new]
akuz
Member [скрыт] [заблокирован]

Откуда:
Сообщений: 6749
Пустяковая вроде задача, а я в ступоре, поможите люди добрые. :)

Существуют две различные БД - подписка и доставка.

Из подписки в доставку импортируются след. данные.

подписчики
- id
- название организации
- фио подписчика
- должность
- адрес
- инн и т.д.

подписные карточки
- id
- подписчик
- издание
- кол-во
- дата начала
- дата окончания

В таблице подписчиков содержатся как юр. так и физ. лица
При этом для юр. лиц заполняется название организации, фио ответственного, его должность, адрес организации, реквизиты организации, для физ. лиц соответственно название организации остаётся пустым, фио подписчика, должность остаётся пустым, адрес подписчика, инн подписчика.
При наличии в организации нескольких подписчиков, на каждого заводится отдельная запись с повторяющимся названием организации.

В таблице карточек содержатся подписные карточки.
При этом на одно физ. лицо может быть назначено несколько карточек, на одно юр. лицо может быть назначено по несколько карточек на каждого подписчика.

Вот такая вот ненормализованная структура.

Для использования в доставке эта структура импортируется с сохранением ключей из подписки в отдельном поле для последующей синхронизации. Дополнительно в доставку вводятся данные из других источников. Т.о. БД подписки является подмножеством БД доставки. Всё прекрасно работает.
Но!!!


Вдруг заказчику понадобилось в доставке хранить список контактных лиц организаций, причём в том числе и тех, которые не являются подписчиками.

Все варианты нормализации получаются какими-то кривыми, ввиду того, что сущность подписчик не хочет распадаться на три - юр. лица, контактные лица, физ.лица, да и задача импорта и синхронизации накладывает свои ограничения.
22 янв 03, 12:39    [112077]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к проектировщикам  [new]
Nickolay
Member

Откуда: Деревня Б.Г.
Сообщений: 1853
а чего надо то?
а структуры баз это уже данность, или их можно поправить?
22 янв 03, 12:55    [112104]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к проектировщикам  [new]
джиммерс
Guest
Из подписки в доставку импортируются след. данные

последующей синхронизации

Для начала необходимо определиться - импорт или синхронизация. Это не одно и то же. Потом описать, как именно работает импорт или синхронизация (особенно синхронизация – масса вариантов). Ну и вопрос сформулировать - что хочется и какой ценой.
22 янв 03, 13:12    [112146]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к проектировщикам  [new]
Jimmy
Member

Откуда: г.Москва
Сообщений: 3136
Из того, как я понял задачу - нужно изменить схему хранения (коль речь зашла о нормализации).

Навскидку такую схему сделал:
Картинка с другого сайта.
22 янв 03, 13:28    [112179]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к проектировщикам  [new]
akuz
Member [скрыт] [заблокирован]

Откуда:
Сообщений: 6749
а чего надо то?

Как обычно - надо удовлетворить заказчика.

Немного уточню.

Заказчику понадобилось в доставке хранить список контактных лиц организаций, причём в том числе и тех, которые не являются подписчиками.
Плюс разбить организации по секторам рынка.
Необходимо это для обеспечения возможности создания подписных карточек по контактным персонам. Например - создать карточки для всех директоров предприятий общественного питания.

Ну и ещё хотелось бы сделать так, чтобы потом переделывать по минимуму пришлось, когда появятся новые требования. Существующая структура продержалась 1,5 года. :)

а структуры баз это уже данность, или их можно поправить?

Поправить можно БД доставки, что мне и надо сделать.
БД подписки - данность от меня не зависящая.

Для начала необходимо определиться - импорт или синхронизация. Это не одно и то же. Потом описать, как именно работает импорт или синхронизация

Выполнено в виде единой хранимой процедуры запускаемой пользователем.

Импорт:
Новые подписчики и карточки в импортируются в доставку из подписки. В доставке создаются новые записи с собственным первичным ключём, первичный ключ записи из подписки сохраняется в поле ext_id.

Синхронизация:
Некоторых полей ранее импортированных подписчиков и карточек в доставке с соответствующими объектами в подписке, обратная связь осуществляется по id из подписки, хранящемуся в импортированной записи в поле ext_id, т.е. если запись импортирована, то ext_id равен id из подписки, если запись заведена вручную, то в ext_id стоит NULL.

Пока ключи в разных БД имеют отношение 1-1 всё хорошо, а вот при нормализации структуры, могут быть варианты. :(

2 Jimmy

Увидел. Сейчас подумаю.
22 янв 03, 13:39    [112201]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к проектировщикам  [new]
Jimmy
Member

Откуда: г.Москва
Сообщений: 3136
В сущности КОНТАКТНОЕ ЛИЦО можно убрать Уникальный ID.
22 янв 03, 13:42    [112209]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к проектировщикам  [new]
akuz
Member [скрыт] [заблокирован]

Откуда:
Сообщений: 6749
2 Jimmy

Наверное в названии нижней сущности на схеме ошибка?
Следует читать "Подписная карточка"?
22 янв 03, 13:45    [112215]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к проектировщикам  [new]
Jimmy
Member

Откуда: г.Москва
Сообщений: 3136
Можно и так. Только тогда глагольные характеристики связей нужно изменить является -> имеет

PS Схема построена по нотации IDEF1X, так что рассуждения о глаголах - не бред и не прихоть. Т.е., если сущности/связи образуют внятные предложения (фразы), то логика 90% правильна.
22 янв 03, 13:49    [112223]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к проектировщикам  [new]
Jimmy
Member

Откуда: г.Москва
Сообщений: 3136
Ну и до кучи: Основы IDEF1X
22 янв 03, 13:51    [112227]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к проектировщикам  [new]
Nickolay
Member

Откуда: Деревня Б.Г.
Сообщений: 1853
2Jimmy: а зачем размножать такие сущности как ID организации и ID частное лицо? Не проще ли завязать таблицу подписчик на контактное лицо? При этом физическое (частное) лицо, естественно является и контактным поэтому эти две таблицы можно слить, и убрать FK для ID организации. Таким образом если физическое лицо никого кроме себя не представляет ID организации будет NULL. А так как организация общается с фирмой через контактное лицо, то ID организации можно вообще выкинуть из таблицы подписчиков...
22 янв 03, 15:07    [112401]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к проектировщикам  [new]
Jimmy
Member

Откуда: г.Москва
Сообщений: 3136
2 Nickolay

akuz:
Вдруг заказчику понадобилось в доставке хранить список контактных лиц организаций, причём в том числе и тех, которые не являются подписчиками.

Nickolay:
а зачем размножать такие сущности как ID организации и ID частное лицо? Не проще ли завязать таблицу подписчик на контактное лицо? При этом физическое (частное) лицо, естественно является и контактным поэтому эти две таблицы можно слить, и убрать FK для ID организации.

Jimmy:
1. Сущность - таблица (в терминах РСУБД), а ID* - атрибуты.
2. Можно, конечно, ссылку на организацию хранить и в сущности ФИЗ ЛИЦО, но:

-- если некто будет выступать как индивидуал, и как представитель фирмы одновременно, то что делать?

-- если некто будет представителем нескольких фирм?

-- зачем сущность ПОДПИСЧИК завязывать на контактное лицо, если в постановке от akuz этот момент отрицается изначально?
22 янв 03, 16:50    [112582]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к проектировщикам  [new]
Nickolay
Member

Откуда: Деревня Б.Г.
Сообщений: 1853
2Jimmy: нас спрашивают - мы отвечаем:
если некто будет выступать как индивидуал, и как представитель фирмы одновременно, то что делать? - заводить два контактных лица, ведь в первом случае он будет представлять самого себя, а во втором организацию.
если некто будет представителем нескольких фирм? - см. предыдущий ответ. Хотя обычно контактное лицо это один из работников фирмы и данный вариант скорее надуман, как впрочем и предыдущий, хотя не мне об этом судить а скорее akuz-у...
зачем сущность ПОДПИСЧИК завязывать на контактное лицо, если в постановке от akuz этот момент отрицается изначально? - потому что как ты сам говорил если сущности/связи образуют внятные предложения (фразы), то логика 90% правильна, а кто является контактным лицом, если в роли заказчика выступает физическое лицо? И как можно контактировать с заказчиком без какого бы то ни было контактного лица?

Некоторые комментарии:
насчет двух первых вопросов, так это ты сам додумал такие ситуации, хотя в ТЗ от akuz-а я их не обнаружил, а насчет третьего вопроса ты погорячился - не было ни слова сказано о том, что физическое лицо не может быть контактным... так что давай не будем ломать копья о ветряные мельницы
22 янв 03, 17:34    [112656]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к проектировщикам  [new]
Genady
Member

Откуда: Москва
Сообщений: 2005
2 Nickolay

Правильно, нефиг ломать ветряные мельницы о копья.

заводить два контактных лица

Да и нормализация никому нафик не нужна.
22 янв 03, 17:41    [112670]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к проектировщикам  [new]
akuz
Member [скрыт] [заблокирован]

Откуда:
Сообщений: 6749
Спасибо за помощь.

К сожалению не имею под рукой средства формирования IDEF1X диаграм, поэтому попробую словами. Вот как мне видится в итоге:

подписчик (сущность несущая информацию о том кому и куда доставлять, оставлена и для обратной совместимости)
- id
- организация (на случай, если контактная персона не указана. для физ. лиц NULL)
- человек (нечёткая связь)
- адрес (для конт. персон копируется из организации, может быть изменён)
- инн

организация (собственно организация)
- id
- название организации
- адрес
- телефоны (общие- факс, ресепшн и т.д.)
- сектор рынка
- пр. атрибуты

человек :) (просто человек, может где то работать и даже иметь номер телефона)
- id
- организация (нечёткая связь, для физ. лиц NULL)
- фио
- телефоны (для контактных персон дополнительный к телефонам организации)
- должность

подписная карточка (без изменений)
- id
- подписчик (чёткая связь)
- издание
- кол-во
- дата начала
- дата окончания

Считать сущность и таблица БД тождественно равными.

-- если некто будет представителем нескольких фирм?
Об этом лучше не думать :). Хотя в такой структуре и это возможно, будет просто несколько подписчиков с одинаковым челом и разной организацией.

Ну вот теперь осталось закрутить процедуру синхронизации, так чтобы она отделила мух от котлет, и сделать так, чтобы от такого полиморфизма у юзверя крыша не поехала, но это уже совсем другая история...
22 янв 03, 17:43    [112675]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к проектировщикам  [new]
Jimmy
Member

Откуда: г.Москва
Сообщений: 3136
2 Nickolay
а насчет третьего вопроса ты погорячился - не было ни слова сказано о том, что физическое лицо не может быть контактным

А я и не говорил про то, что физ лицо <> контактному. И akuz не говорил, а говорил он вот что: ...список контактных лиц организаций, причём в том числе и тех, которые не являются подписчиками

Вот я и спрашиваю, на кой привязывать контактное лицо к подписчикам?

насчет двух первых вопросов, так это ты сам додумал такие ситуации, хотя в ТЗ от akuz-а я их не обнаружил,

Это не я надумал, это те самые грабли, на которые и наступают чаще всего: "Зачем нужна эта сущность, раз клиенту этого не надо", а через неделю после установки проги выясняется, что надо, но забыли сказать или потом появится нужда. В общем - страховочный вариант.

ЗЫ Ну а если все же не надо, то и не нужна - я просто заткнул потенциальную дыру.
22 янв 03, 18:29    [112735]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к проектировщикам  [new]
akuz
Member [скрыт] [заблокирован]

Откуда:
Сообщений: 6749
И как можно контактировать с заказчиком без какого бы то ни было контактного лица?
А для чего тогда нужен ресепшн? А может там почтовый ящик, вообще без лица. :)

а кто является контактным лицом, если в роли заказчика выступает физическое лицо?
Жена например или тёща или тот-же почтовый ящик без лица. :)

Поэтому то без подписчика ну никак не обойтись.
Кстати может быть вообще безликий адрес.

Наверно я просто неправильно назвал сущность, то, что подписка называет подписчики в доставке должно называться адресат, было бы понятнее.
Но теперь уже поздно, юзвери привыкли. :(

А я и не говорил про то, что физ лицо <> контактному. И akuz не говорил, а говорил он вот что: ...список контактных лиц организаций, причём в том числе и тех, которые не являются подписчиками

Всё правильно, но они являются потенциальными подписчиками, правда в качестве контактных лиц.

Да и нормализация никому нафик не нужна.

Я тоже к этому варианту склоняюсь.

Сейчас буду обсуждать с заказчиком, посмотрим, что он скажет.
22 янв 03, 18:53    [112761]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к проектировщикам  [new]
akuz
Member [скрыт] [заблокирован]

Откуда:
Сообщений: 6749
Ну вот, получилось как всегда - после полуторачасовых переговоров о нормализации и целостности данных c моей стороны и уверений в том, что нескольких подписчиков для одной организации ПОЧТИ не бывает, с его, заказчик всё таки настоял на своём.
Что ж, жираф большой ...

подписчик (он же организация)
- id
- название организации
- фио подписчика
- должность
- адрес
- инн и т.д.

контактное лицо
- id
- подписчик (он же организация)
- фио
- должность
- телефоны

подписные карточки
- id
- подписчик (он же организация)
- контактное лицо (если необходима адресная доставка внутри одной организации, при безадресной доставке - NULL)
- издание
- кол-во
- дата начала
- дата окончания

А вы говорите - нормализация!
24 янв 03, 14:29    [114357]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить