Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Создание пустого договора / 25 сообщений из 27, страница 1 из 2
01.06.2008, 13:30
    #35347611
docom
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание пустого договора
Имеется система управления пользователями. Заказчик хочет предусмотреть возможность создания пустого договора, т.е. договора, который имеет только пару-тройку заполненных аттрибутов, таких как номер договора (генерируется БД) пароль и логин. Остальные аттрибуты (ФИО, паспорт и пр.) будут заполнены в договоре вручную менеджером, когда он приедет лично к пользователю и позднее внесены в базу.
Я так понимаю, что есть два способа - создавать фиктивного пользователя (например автоматически вбивать в поля что-то типа ФиктивныйПользователь1) или разрешать nullable поля с добавлением аттрибута "Пустой".
Может есть какие-то стандартные методы решения такой задачи ?
...
Рейтинг: 0 / 0
01.06.2008, 14:39
    #35347654
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание пустого договора
docomИмеется система управления пользователями. Заказчик хочет предусмотреть возможность создания пустого договора, т.е. договора, который имеет только пару-тройку заполненных аттрибутов, таких как номер договора (генерируется БД) пароль и логин. Остальные аттрибуты (ФИО, паспорт и пр.) будут заполнены в договоре вручную менеджером, когда он приедет лично к пользователю и позднее внесены в базу.
Я так понимаю, что есть два способа - создавать фиктивного пользователя (например автоматически вбивать в поля что-то типа ФиктивныйПользователь1) или разрешать nullable поля с добавлением аттрибута "Пустой".
Может есть какие-то стандартные методы решения такой задачи ?
т.е. шаблон?
...
Рейтинг: 0 / 0
01.06.2008, 14:40
    #35347655
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание пустого договора
Дефолтные значения задавать пробовали?
...
Рейтинг: 0 / 0
01.06.2008, 15:32
    #35347694
docom
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание пустого договора
gardenman
Дефолтные значения задавать пробовали?

дефолтные значения негодятся - например на таблице должно иметься ограничение на уникальность номера паспорта, соответственно более одного пустого договора таким образом не внести.
...
Рейтинг: 0 / 0
01.06.2008, 16:02
    #35347712
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание пустого договора
docomЯ так понимаю, что есть два способа
Куда больше.

docomсоздавать фиктивного пользователя (например автоматически вбивать в поля что-то типа ФиктивныйПользователь1)
Я не знаю случая, при котором автора подобной идеи не следовало бы убить во младенчестве. Попробую очень коротко объяснить: действуя так, Вы автоматом накладываете на себя и на любого коллегу обязательство для каждой таблицы в каждом запросе думать: а могут ли попасть сюда фиктивные записи? а фиктивные значения? а что с ними делать? В простых программах соблюсти это требование можно, просто дорого (либо в смысле трудоемкости, либо в смысле производительности) и неприятно. В более сложных - следствием этого неизбежно будет значительное количество ошибок и постоянный геморрой.

Приведу несколько примеров глюков, которые запомнились из такой системы и были следствием именно этого подхода:

Для договоров определенного вида датой заключения (а следовательно расчета цен итп) всегда считалось 21.03.2002


Диспетчеры вечером назначали сотрудников на завтрашние выезды, а с утра видели девственно чистый список назначений


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

docomили разрешать nullable поля с добавлением аттрибута "Пустой".
В принципе можно. Если лучше, то надо сделать check constraints вида "Статус = фиктивный or field is not null" либо зашить подобные проверки в хранимки. На что нужно обратить внимание - незаполненный договор ни в коем случае не должен пойти "в работу".

docomМожет есть какие-то стандартные методы решения такой задачи ?
Кроме этого, стоит рассмотреть вариант, при котором полувведенный договор будет лежать в отдельной табличке - типа ФиктивныеДоговора - или даже в универсальном буфере, скажем xml-ном. Суть в том, что "сохранить черновик, ни фига не проверяя, а потом прийти и продолжить работу" - довольно типичная задача, и выделив такой буфер, мы одновременно даем возможность делать так в любом документе и надежно уберегаем "нормальные проверенные данные" от смешивания с "пока мусором".
...
Рейтинг: 0 / 0
01.06.2008, 16:03
    #35347713
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание пустого договора
docomдефолтные значения негодятся - например на таблице должно иметься ограничение на уникальность номера паспорта, соответственно более одного пустого договора таким образом не внести.
Плюньте в лицо тому, кто Вам сказал такую глупость, после чего выберите для работы СУБД, совместимую со стандартом ANSI SQL.
...
Рейтинг: 0 / 0
01.06.2008, 16:05
    #35347715
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание пустого договора
softwarer docomдефолтные значения негодятся - например на таблице должно иметься ограничение на уникальность номера паспорта, соответственно более одного пустого договора таким образом не внести.
Плюньте в лицо тому, кто Вам сказал такую глупость, после чего выберите для работы СУБД, совместимую со стандартом ANSI SQL.
Cтоп. Прошу прощения, отвлекся и кардинально неверно понял вашу беседу с gardenman-ом. Сказанное мной не имеет отношения к вашему случаю, виноват.
...
Рейтинг: 0 / 0
01.06.2008, 20:13
    #35347893
docom
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание пустого договора
softwarer
Я не знаю случая, при котором автора подобной идеи не следовало бы убить во младенчестве.

спасибо, понятно

softwarer
В принципе можно. Если лучше, то надо сделать check constraints вида "Статус = фиктивный or field is not null" либо зашить подобные проверки в хранимки. На что нужно обратить внимание - незаполненный договор ни в коем случае не должен пойти "в работу".
...
Кроме этого, стоит рассмотреть вариант, при котором полувведенный договор будет лежать в отдельной табличке - типа ФиктивныеДоговора - или даже в универсальном буфере, скажем xml-ном. Суть в том, что "сохранить черновик, ни фига не проверяя, а потом прийти и продолжить работу" - довольно типичная задача, и выделив такой буфер, мы одновременно даем возможность делать так в любом документе и надежно уберегаем "нормальные проверенные данные" от смешивания с "пока мусором".

тут видите какая хитрость - на самом деле договор не совсем "мусор".
"Пустой" договор (на подключение к сети) уже будет иметь такие параметры как IP-адреса, имя компьютера и логин. Все эти параметры являются уникальными для системы. Т.е. нельзя написать в договоре IP = 192.168.1.32, и отложить на потом, так как иначе этот адрес случайно может быть присвоен кому-то еще (это-же касается имени компьютера и логина). Кроме того, ID договора является Identity-полем и соответственно тоже должен быть сгенерирован сразу и навсегда.
Так что к сожалению, отдельная табличка не подойдет. Придеться видимо null-столбцы разрешать. Просто это сплошная головная боль - ведь на самом деле из-за нормализации, договор не одна таблица, а несколько.
Например Договор имеет ссылку на Клиента, которая в пустом договоре должна будет быть null.
Таблица с местом подключения (улица, дом, квартира ...) сама имеет ссылку на таблицу с акаунтами, а раз такой информации нету, то и записи нету, а ведь например запрос, который у меня выводит список аккаунтов джойнится на нее, т.е. запись с неполным аккаунтом в резалтсет не попадет, а она там нужна, т.к. там IP-адреса, значит надо запрос (и вообще много других запросо) изменять с учетом этого.
Кроме того, надо как-то целостность гарантировать между всеми этими таблицами, Ужос вообщем :(
Я потому и думал, что может таблицы как-то фиктивными данными забивать ...
...
Рейтинг: 0 / 0
01.06.2008, 20:33
    #35347904
apapacy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание пустого договора
С точки зрения чистой теории тут все понятнои есть ровно два варианта.
1. Таблица с NULL значениями
2. Две таблицы без NULL Значений связанные 1:1.
Теоретики советуют выбирать первый вариант. а практики (чаще) второй.
Я бы в данном случае выбрал 2-й вариант.
...
Рейтинг: 0 / 0
01.06.2008, 21:00
    #35347938
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание пустого договора
docom пишет:

> Я так понимаю, что есть два способа - создавать фиктивного пользователя
> (например автоматически вбивать в поля что-то типа
> ФиктивныйПользователь1) или разрешать nullable поля с добавлением
> аттрибута "Пустой".

> Может есть какие-то стандартные методы решения такой задачи ?

Есть, второй способ, вами указанный.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
01.06.2008, 21:15
    #35347945
apapacy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание пустого договора
apapacyС точки зрения чистой теории тут все понятнои есть ровно два варианта.
1. Таблица с NULL значениями
2. Две таблицы без NULL Значений связанные 1:1.
Теоретики советуют выбирать первый вариант. а практики (чаще) второй.
Я бы в данном случае выбрал 2-й вариант.
Обсчитался. Теоретики советуют второй вариант и наборот
...
Рейтинг: 0 / 0
02.06.2008, 12:09
    #35348624
Сергей Васкецов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание пустого договора
apapacy apapacyС точки зрения чистой теории тут все понятнои есть ровно два варианта.
1. Таблица с NULL значениями
2. Две таблицы без NULL Значений связанные 1:1.
Теоретики советуют выбирать первый вариант. а практики (чаще) второй.
Я бы в данном случае выбрал 2-й вариант.
Обсчитался. Теоретики советуют второй вариант и наборот
+1. Я за первый.
...
Рейтинг: 0 / 0
02.06.2008, 12:40
    #35348720
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание пустого договора
docomтут видите какая хитрость - на самом деле договор не совсем "мусор". "Пустой" договор (на подключение к сети) уже будет иметь такие параметры как IP-адреса, имя компьютера и логин.
Не совсем, конечно, хотя именно такие параметры удивляют. Вот не очень представляю, зачем заранее выделять адрес.

docomПросто это сплошная головная боль
Ничуть.

docomНапример Договор имеет ссылку на Клиента, которая в пустом договоре должна будет быть null.
Вот это как раз странно. "Договор неизвестно с кем" - сильный ход с точки зрения бизнеса. Я пойму, если останутся незаполненными второстепенные реквизиты клиента - адрес итп - но информации должно быть достаточно для того, чтобы я через полгода пришел к вам и сказал "я Иванов, где мой договор?"

docomа ведь например запрос, который у меня выводит список аккаунтов джойнится на нее, т.е. запись с неполным аккаунтом в резалтсет не попадет, а она там нужна
Откройте для себя outer join :)

docomКроме того, надо как-то целостность гарантировать между всеми этими таблицами,
Foreign keys вполне справляются с этой задачей.

docomУжос вообщем :(
Не, не ужас. Поверьте: "записи нет там, где она нужна" - на порядок меньшее зло, нежели "запись вылезла там, где она не нужна". Поэтому расставить в нужных местах outer joins - гораздо лучше, нежели отфильтровывать "почти всюду" фиктивные значения.
...
Рейтинг: 0 / 0
02.06.2008, 12:41
    #35348723
ModelR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание пустого договора
Полное решение должно основываться на механизме состояний ( статусов) договора.
Как правило, этот механизм - дело приложения. В собственно базе можно конечно ввести ограничения типа

not Статус='Подписан' or Клиент is not null

однако обычно это оставляют прикладному коду чтобы не размазывать логику статусов по разным частям системы.
Т.е в базе остается чисто nullable Клиент.
...
Рейтинг: 0 / 0
02.06.2008, 13:21
    #35348849
shelsoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание пустого договора
docomСоздание пустого договора
1) Создаете пустой договор на фиктивного клиента
2) Статус договора (проект/подписан)
3) Ссылка на манагера, кто зарезервировал номер
4) Определяется временной промежуток резерва, зарезервированные договора не учитываются в качестве критерия эффективности работы манагера
5) Необходимо решить вопрос с нумерацией договором (можно ли согласно вашим правилам вести нумерацию с разрывами, или не использованные номера надо возвращать)



______________________________________________________
Задолбали вихри яростных атак ...
...
Рейтинг: 0 / 0
03.06.2008, 16:03
    #35351681
docom
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание пустого договора
softwarer
Не совсем, конечно, хотя именно такие параметры удивляют. Вот не очень представляю, зачем заранее выделять адрес.

IP-адрес нужно выделить заранее, потому-что клиенту вместе с договором на подпись будет вручена памятка на подключение, где будут указаны его сетевые параметры. Если его таким образом не зарезервировать, то он может случайно быть присвоен другому человеку до того, как договор из "пустого" состояния перейдет в законченное.

softwarer
Вот это как раз странно. "Договор неизвестно с кем" - сильный ход с точки зрения бизнеса. Я пойму, если останутся незаполненными второстепенные реквизиты клиента - адрес итп - но информации должно быть достаточно для того, чтобы я через полгода пришел к вам и сказал "я Иванов, где мой договор?"

вообще конечно логично :) Пожалуй действительно ФИО следует сделать обязательным для пустого договора, ведь его вполне можно узнать по телефону. Тогда у сущности Клиент будет только один null-параметр - его паспорт.

softwarer
Не, не ужас. Поверьте: "записи нет там, где она нужна" - на порядок меньшее зло, нежели "запись вылезла там, где она не нужна". Поэтому расставить в нужных местах outer joins - гораздо лучше, нежели отфильтровывать "почти всюду" фиктивные значения.

просто тут 2 проблемы, первая - необходимо всегда помнить, что некоторые данные могут быть null, и вторая - как-то гарантировать целостность, т.е. например раз договор имеет статус "Пустой", то паспорт у клиента должен быть null, и запись в таблице места подключения должна отсутствовать.

ModelR
однако обычно это оставляют прикладному коду чтобы не размазывать логику статусов по разным частям системы.
Т.е в базе остается чисто nullable Клиент.

логика ограничений-то так и так будет дублироваться - и в domain-model, и в БД. Иначе вдруг какой-нибудь сильно умный админ руками в БД полезет чего-нибудь подправить, или кто-то напишет еще одного клиента к БД.

shelsoft
4) Определяется временной промежуток резерва, зарезервированные договора не учитываются в качестве критерия эффективности работы манагера
5) Необходимо решить вопрос с нумерацией договором (можно ли согласно вашим правилам вести нумерацию с разрывами, или не использованные номера надо возвращать)

пустой договор обязательно получает номер, ну а временной резерв к счастью не ограничен. Хоть через полгода заполнят до конца
...
Рейтинг: 0 / 0
03.06.2008, 16:08
    #35351696
Сергей Васкецов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание пустого договора
docomIP-адрес нужно выделить заранее, потому-что клиенту вместе с договором на подпись будет вручена памятка на подключение, где будут указаны его сетевые параметры. Если его таким образом не зарезервировать, то он может случайно быть присвоен другому человеку до того, как договор из "пустого" состояния перейдет в законченное.
Налицо кривой БП. Может IP-адрес у клиента смениться? Тут все то же самое. Как и в случаем физического адреса оконечного оборудования клиента. По сути - адрес не является параметром договора и может быть утвержден, например, доп. соглашением.
...
Рейтинг: 0 / 0
03.06.2008, 16:08
    #35351699
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание пустого договора
docomIP-адрес нужно выделить заранее, потому-что клиенту вместе с договором на подпись будет вручена памятка на подключение, где будут указаны его сетевые параметры.
Я таки сомневаюсь в разумности такого подхода. Во-первых, я вообще не понимаю, зачем выделять адреса и почему бы не использовать dhcp. Во-вторых, я уверен в том, что клиент через полгода не найдет эту бумажку. Ну а в-третьих, я не очень понимаю, кто мешает послать ему емейл с новыми реквизитами.

docomпросто тут 2 проблемы, первая - необходимо всегда помнить, что некоторые данные могут быть null,
С практической точки зрения куда меньшая проблема, нежели "всегда помнить, что некоторые данные могут быть фиктивными".

docomи вторая - как-то гарантировать целостность, т.е. например раз договор имеет статус "Пустой", то паспорт у клиента должен быть null, и запись в таблице места подключения должна отсутствовать.
И в чем проблема?
...
Рейтинг: 0 / 0
03.06.2008, 16:49
    #35351842
docom
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание пустого договора
Сергей Васкецов
Налицо кривой БП. Может IP-адрес у клиента смениться? Тут все то же самое. Как и в случаем физического адреса оконечного оборудования клиента. По сути - адрес не является параметром договора и может быть утвержден, например, доп. соглашением.

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

ну что я могу сказать - не я придумывал бизнес-правила. Насколько знаю, ситуация такая - все подключенные к сети дома имеют выделенные им диапазоны IP-адресов. Так что каждый пользователь может иметь адрес только из тех диапазонов, которые закреплены за домом. Адрес внутри сети, и внешний IP-адрес нужны для того, что-бы настроить подключение к локальной сети и Интернету (там есть авторизатор, который требует эти данные, так что динамически адреса вроде как не выделить, хотя я вообще-то не специалист по сетям :)
Вот вы приехали к человеку, дали памятку, начинаете настраивать и обнаруживаете что указанный адрес уже занят. Ну можно наверно позвонить в офис, назначить новый адрес и исправить памятку, просто нафига :) Если адрес сразу зарезервирован, проблем имхо куда меньше.
А так да, IP не относиться к договору как таковому и может в дальнейшем меняться. Он поэтому и написан на памятке, а не в договоре

softwarer
И в чем проблема?

ну триггер там писать и все такое :) Я конечно с вами особо не спорю, сделать все можно, просто вообще-то такая проверка может оказаться довольно трудоемкой. Потому и спрашивал, может какие-то хитрые решения этого существуют, что-бы велосипед не изобретать ...
...
Рейтинг: 0 / 0
03.06.2008, 17:23
    #35351943
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание пустого договора
docom softwarerНе, не ужас. Поверьте: "записи нет там, где она нужна" - на порядок меньшее зло, нежели "запись вылезла там, где она не нужна". Поэтому расставить в нужных местах outer joins - гораздо лучше, нежели отфильтровывать "почти всюду" фиктивные значения.

просто тут 2 проблемы, первая - необходимо всегда помнить, что некоторые данные могут быть null, и вторая - как-то гарантировать целостность, т.е. например раз договор имеет статус "Пустой", то паспорт у клиента должен быть null, и запись в таблице места подключения должна отсутствовать.тут нет проблем и нечего тут помнить, да и проверка нужна обратная. Договор не может менять статус с "Пустой" на "Полный", пока не проставлены паспорт клиента, запись в таблице места подключения, etc.
...
Рейтинг: 0 / 0
03.06.2008, 17:44
    #35352003
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание пустого договора
docomну триггер там писать
Нафига?

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

docomПотому и спрашивал, может какие-то хитрые решения этого существуют,
Зачем хитрые, когда легко решается очевидными, и они уже названы в топике?
...
Рейтинг: 0 / 0
03.06.2008, 19:09
    #35352242
docom
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание пустого договора
softwarer
Нафига?

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

softwarer
Хм. Времени, которого мы потратили на этот разговор, хватило бы на наиболее трудоемкую реализацию нескольких таких проверок :)

но принципиально-то ведь может создасться ситуация, когда проверка будет сложной, какой-нибудь очень навороченный объект попадется ...
...
Рейтинг: 0 / 0
03.06.2008, 19:48
    #35352307
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание пустого договора
docomа как вы собираетесь обеспечивать целостность данных между двумя таблицами ? К примеру в данном случае, требуется обеспечить что-бы поле "Пустой" было null только в том случае, если запись об адресе на данный контракт в другой таблице отсутствует.
Элементарно. Протянуть внешний ключ из "этой" таблицы в "другую" и написать check на "поля вместе null либо вместе заполнены". Если кроме того хотим обеспечить невозможность нескольких инсталляций по одному адресу, пишем еще unique.

docomно принципиально-то ведь может создасться ситуация, когда проверка будет сложной, какой-нибудь очень навороченный объект попадется ...
Принципиально может сложиться ситуация, когда надо месяц сидеть и решать задачу.... и я сразу могу сказать, что серебряной пули, решающей ее за тридцать секунд - пока не существует.
...
Рейтинг: 0 / 0
04.06.2008, 02:30
    #35352864
JustPT001
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание пустого договора
В своё время мы реализовали одну из вариаций EAV, где не было null-ссылок (а значит - не было outer join), но одновременно с этим null-ссылки "были".
Получилось достаточно удобно, хотя, как и все EAV - иногда недостаточно быстро.

-----------------------------------
Вперёд назад за лиловыми кроликами!
...
Рейтинг: 0 / 0
04.06.2008, 11:00
    #35353350
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание пустого договора
JustPT001В своё время мы реализовали одну из вариаций EAV, где не было null-ссылок (а значит - не было outer join)
Меня перманентно удивляет постановка вопроса "главное, чтобы чего-то не было" при том, что встречается в самых разных вариациях - чтобы не было аутер джойнов, чтобы не было исключений.... я даже знаю один проект, где на административном уровне запретили пользоваться наследованием (в обычном ООП смысле этого слова).

JustPT001Получилось достаточно удобно
Хотелось бы увидеть.
...
Рейтинг: 0 / 0
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Создание пустого договора / 25 сообщений из 27, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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