|
|
|
Создание пустого договора
|
|||
|---|---|---|---|
|
#18+
Имеется система управления пользователями. Заказчик хочет предусмотреть возможность создания пустого договора, т.е. договора, который имеет только пару-тройку заполненных аттрибутов, таких как номер договора (генерируется БД) пароль и логин. Остальные аттрибуты (ФИО, паспорт и пр.) будут заполнены в договоре вручную менеджером, когда он приедет лично к пользователю и позднее внесены в базу. Я так понимаю, что есть два способа - создавать фиктивного пользователя (например автоматически вбивать в поля что-то типа ФиктивныйПользователь1) или разрешать nullable поля с добавлением аттрибута "Пустой". Может есть какие-то стандартные методы решения такой задачи ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2008, 13:30 |
|
||
|
Создание пустого договора
|
|||
|---|---|---|---|
|
#18+
docomИмеется система управления пользователями. Заказчик хочет предусмотреть возможность создания пустого договора, т.е. договора, который имеет только пару-тройку заполненных аттрибутов, таких как номер договора (генерируется БД) пароль и логин. Остальные аттрибуты (ФИО, паспорт и пр.) будут заполнены в договоре вручную менеджером, когда он приедет лично к пользователю и позднее внесены в базу. Я так понимаю, что есть два способа - создавать фиктивного пользователя (например автоматически вбивать в поля что-то типа ФиктивныйПользователь1) или разрешать nullable поля с добавлением аттрибута "Пустой". Может есть какие-то стандартные методы решения такой задачи ? т.е. шаблон? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2008, 14:39 |
|
||
|
Создание пустого договора
|
|||
|---|---|---|---|
|
#18+
Дефолтные значения задавать пробовали? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2008, 14:40 |
|
||
|
Создание пустого договора
|
|||
|---|---|---|---|
|
#18+
gardenman Дефолтные значения задавать пробовали? дефолтные значения негодятся - например на таблице должно иметься ограничение на уникальность номера паспорта, соответственно более одного пустого договора таким образом не внести. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2008, 15:32 |
|
||
|
Создание пустого договора
|
|||
|---|---|---|---|
|
#18+
docomЯ так понимаю, что есть два способа Куда больше. docomсоздавать фиктивного пользователя (например автоматически вбивать в поля что-то типа ФиктивныйПользователь1) Я не знаю случая, при котором автора подобной идеи не следовало бы убить во младенчестве. Попробую очень коротко объяснить: действуя так, Вы автоматом накладываете на себя и на любого коллегу обязательство для каждой таблицы в каждом запросе думать: а могут ли попасть сюда фиктивные записи? а фиктивные значения? а что с ними делать? В простых программах соблюсти это требование можно, просто дорого (либо в смысле трудоемкости, либо в смысле производительности) и неприятно. В более сложных - следствием этого неизбежно будет значительное количество ошибок и постоянный геморрой. Приведу несколько примеров глюков, которые запомнились из такой системы и были следствием именно этого подхода: Для договоров определенного вида датой заключения (а следовательно расчета цен итп) всегда считалось 21.03.2002 Диспетчеры вечером назначали сотрудников на завтрашние выезды, а с утра видели девственно чистый список назначений Каждый раз, когда сотрудника, включенного в группу "получают почту во всех филиалах" переводили с места на место, генеральный директор получал как якобы свежие пачку писем из серии "прочитал еще пару лет назад". docomили разрешать nullable поля с добавлением аттрибута "Пустой". В принципе можно. Если лучше, то надо сделать check constraints вида "Статус = фиктивный or field is not null" либо зашить подобные проверки в хранимки. На что нужно обратить внимание - незаполненный договор ни в коем случае не должен пойти "в работу". docomМожет есть какие-то стандартные методы решения такой задачи ? Кроме этого, стоит рассмотреть вариант, при котором полувведенный договор будет лежать в отдельной табличке - типа ФиктивныеДоговора - или даже в универсальном буфере, скажем xml-ном. Суть в том, что "сохранить черновик, ни фига не проверяя, а потом прийти и продолжить работу" - довольно типичная задача, и выделив такой буфер, мы одновременно даем возможность делать так в любом документе и надежно уберегаем "нормальные проверенные данные" от смешивания с "пока мусором". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2008, 16:02 |
|
||
|
Создание пустого договора
|
|||
|---|---|---|---|
|
#18+
docomдефолтные значения негодятся - например на таблице должно иметься ограничение на уникальность номера паспорта, соответственно более одного пустого договора таким образом не внести. Плюньте в лицо тому, кто Вам сказал такую глупость, после чего выберите для работы СУБД, совместимую со стандартом ANSI SQL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2008, 16:03 |
|
||
|
Создание пустого договора
|
|||
|---|---|---|---|
|
#18+
softwarer docomдефолтные значения негодятся - например на таблице должно иметься ограничение на уникальность номера паспорта, соответственно более одного пустого договора таким образом не внести. Плюньте в лицо тому, кто Вам сказал такую глупость, после чего выберите для работы СУБД, совместимую со стандартом ANSI SQL. Cтоп. Прошу прощения, отвлекся и кардинально неверно понял вашу беседу с gardenman-ом. Сказанное мной не имеет отношения к вашему случаю, виноват. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2008, 16:05 |
|
||
|
Создание пустого договора
|
|||
|---|---|---|---|
|
#18+
softwarer Я не знаю случая, при котором автора подобной идеи не следовало бы убить во младенчестве. спасибо, понятно softwarer В принципе можно. Если лучше, то надо сделать check constraints вида "Статус = фиктивный or field is not null" либо зашить подобные проверки в хранимки. На что нужно обратить внимание - незаполненный договор ни в коем случае не должен пойти "в работу". ... Кроме этого, стоит рассмотреть вариант, при котором полувведенный договор будет лежать в отдельной табличке - типа ФиктивныеДоговора - или даже в универсальном буфере, скажем xml-ном. Суть в том, что "сохранить черновик, ни фига не проверяя, а потом прийти и продолжить работу" - довольно типичная задача, и выделив такой буфер, мы одновременно даем возможность делать так в любом документе и надежно уберегаем "нормальные проверенные данные" от смешивания с "пока мусором". тут видите какая хитрость - на самом деле договор не совсем "мусор". "Пустой" договор (на подключение к сети) уже будет иметь такие параметры как IP-адреса, имя компьютера и логин. Все эти параметры являются уникальными для системы. Т.е. нельзя написать в договоре IP = 192.168.1.32, и отложить на потом, так как иначе этот адрес случайно может быть присвоен кому-то еще (это-же касается имени компьютера и логина). Кроме того, ID договора является Identity-полем и соответственно тоже должен быть сгенерирован сразу и навсегда. Так что к сожалению, отдельная табличка не подойдет. Придеться видимо null-столбцы разрешать. Просто это сплошная головная боль - ведь на самом деле из-за нормализации, договор не одна таблица, а несколько. Например Договор имеет ссылку на Клиента, которая в пустом договоре должна будет быть null. Таблица с местом подключения (улица, дом, квартира ...) сама имеет ссылку на таблицу с акаунтами, а раз такой информации нету, то и записи нету, а ведь например запрос, который у меня выводит список аккаунтов джойнится на нее, т.е. запись с неполным аккаунтом в резалтсет не попадет, а она там нужна, т.к. там IP-адреса, значит надо запрос (и вообще много других запросо) изменять с учетом этого. Кроме того, надо как-то целостность гарантировать между всеми этими таблицами, Ужос вообщем :( Я потому и думал, что может таблицы как-то фиктивными данными забивать ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2008, 20:13 |
|
||
|
Создание пустого договора
|
|||
|---|---|---|---|
|
#18+
С точки зрения чистой теории тут все понятнои есть ровно два варианта. 1. Таблица с NULL значениями 2. Две таблицы без NULL Значений связанные 1:1. Теоретики советуют выбирать первый вариант. а практики (чаще) второй. Я бы в данном случае выбрал 2-й вариант. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2008, 20:33 |
|
||
|
Создание пустого договора
|
|||
|---|---|---|---|
|
#18+
docom пишет: > Я так понимаю, что есть два способа - создавать фиктивного пользователя > (например автоматически вбивать в поля что-то типа > ФиктивныйПользователь1) или разрешать nullable поля с добавлением > аттрибута "Пустой". > Может есть какие-то стандартные методы решения такой задачи ? Есть, второй способ, вами указанный. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2008, 21:00 |
|
||
|
Создание пустого договора
|
|||
|---|---|---|---|
|
#18+
apapacyС точки зрения чистой теории тут все понятнои есть ровно два варианта. 1. Таблица с NULL значениями 2. Две таблицы без NULL Значений связанные 1:1. Теоретики советуют выбирать первый вариант. а практики (чаще) второй. Я бы в данном случае выбрал 2-й вариант. Обсчитался. Теоретики советуют второй вариант и наборот ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2008, 21:15 |
|
||
|
Создание пустого договора
|
|||
|---|---|---|---|
|
#18+
apapacy apapacyС точки зрения чистой теории тут все понятнои есть ровно два варианта. 1. Таблица с NULL значениями 2. Две таблицы без NULL Значений связанные 1:1. Теоретики советуют выбирать первый вариант. а практики (чаще) второй. Я бы в данном случае выбрал 2-й вариант. Обсчитался. Теоретики советуют второй вариант и наборот +1. Я за первый. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2008, 12:09 |
|
||
|
Создание пустого договора
|
|||
|---|---|---|---|
|
#18+
docomтут видите какая хитрость - на самом деле договор не совсем "мусор". "Пустой" договор (на подключение к сети) уже будет иметь такие параметры как IP-адреса, имя компьютера и логин. Не совсем, конечно, хотя именно такие параметры удивляют. Вот не очень представляю, зачем заранее выделять адрес. docomПросто это сплошная головная боль Ничуть. docomНапример Договор имеет ссылку на Клиента, которая в пустом договоре должна будет быть null. Вот это как раз странно. "Договор неизвестно с кем" - сильный ход с точки зрения бизнеса. Я пойму, если останутся незаполненными второстепенные реквизиты клиента - адрес итп - но информации должно быть достаточно для того, чтобы я через полгода пришел к вам и сказал "я Иванов, где мой договор?" docomа ведь например запрос, который у меня выводит список аккаунтов джойнится на нее, т.е. запись с неполным аккаунтом в резалтсет не попадет, а она там нужна Откройте для себя outer join :) docomКроме того, надо как-то целостность гарантировать между всеми этими таблицами, Foreign keys вполне справляются с этой задачей. docomУжос вообщем :( Не, не ужас. Поверьте: "записи нет там, где она нужна" - на порядок меньшее зло, нежели "запись вылезла там, где она не нужна". Поэтому расставить в нужных местах outer joins - гораздо лучше, нежели отфильтровывать "почти всюду" фиктивные значения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2008, 12:40 |
|
||
|
Создание пустого договора
|
|||
|---|---|---|---|
|
#18+
Полное решение должно основываться на механизме состояний ( статусов) договора. Как правило, этот механизм - дело приложения. В собственно базе можно конечно ввести ограничения типа not Статус='Подписан' or Клиент is not null однако обычно это оставляют прикладному коду чтобы не размазывать логику статусов по разным частям системы. Т.е в базе остается чисто nullable Клиент. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2008, 12:41 |
|
||
|
Создание пустого договора
|
|||
|---|---|---|---|
|
#18+
docomСоздание пустого договора 1) Создаете пустой договор на фиктивного клиента 2) Статус договора (проект/подписан) 3) Ссылка на манагера, кто зарезервировал номер 4) Определяется временной промежуток резерва, зарезервированные договора не учитываются в качестве критерия эффективности работы манагера 5) Необходимо решить вопрос с нумерацией договором (можно ли согласно вашим правилам вести нумерацию с разрывами, или не использованные номера надо возвращать) ______________________________________________________ Задолбали вихри яростных атак ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2008, 13:21 |
|
||
|
Создание пустого договора
|
|||
|---|---|---|---|
|
#18+
softwarer Не совсем, конечно, хотя именно такие параметры удивляют. Вот не очень представляю, зачем заранее выделять адрес. IP-адрес нужно выделить заранее, потому-что клиенту вместе с договором на подпись будет вручена памятка на подключение, где будут указаны его сетевые параметры. Если его таким образом не зарезервировать, то он может случайно быть присвоен другому человеку до того, как договор из "пустого" состояния перейдет в законченное. softwarer Вот это как раз странно. "Договор неизвестно с кем" - сильный ход с точки зрения бизнеса. Я пойму, если останутся незаполненными второстепенные реквизиты клиента - адрес итп - но информации должно быть достаточно для того, чтобы я через полгода пришел к вам и сказал "я Иванов, где мой договор?" вообще конечно логично :) Пожалуй действительно ФИО следует сделать обязательным для пустого договора, ведь его вполне можно узнать по телефону. Тогда у сущности Клиент будет только один null-параметр - его паспорт. softwarer Не, не ужас. Поверьте: "записи нет там, где она нужна" - на порядок меньшее зло, нежели "запись вылезла там, где она не нужна". Поэтому расставить в нужных местах outer joins - гораздо лучше, нежели отфильтровывать "почти всюду" фиктивные значения. просто тут 2 проблемы, первая - необходимо всегда помнить, что некоторые данные могут быть null, и вторая - как-то гарантировать целостность, т.е. например раз договор имеет статус "Пустой", то паспорт у клиента должен быть null, и запись в таблице места подключения должна отсутствовать. ModelR однако обычно это оставляют прикладному коду чтобы не размазывать логику статусов по разным частям системы. Т.е в базе остается чисто nullable Клиент. логика ограничений-то так и так будет дублироваться - и в domain-model, и в БД. Иначе вдруг какой-нибудь сильно умный админ руками в БД полезет чего-нибудь подправить, или кто-то напишет еще одного клиента к БД. shelsoft 4) Определяется временной промежуток резерва, зарезервированные договора не учитываются в качестве критерия эффективности работы манагера 5) Необходимо решить вопрос с нумерацией договором (можно ли согласно вашим правилам вести нумерацию с разрывами, или не использованные номера надо возвращать) пустой договор обязательно получает номер, ну а временной резерв к счастью не ограничен. Хоть через полгода заполнят до конца ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2008, 16:03 |
|
||
|
Создание пустого договора
|
|||
|---|---|---|---|
|
#18+
docomIP-адрес нужно выделить заранее, потому-что клиенту вместе с договором на подпись будет вручена памятка на подключение, где будут указаны его сетевые параметры. Если его таким образом не зарезервировать, то он может случайно быть присвоен другому человеку до того, как договор из "пустого" состояния перейдет в законченное. Налицо кривой БП. Может IP-адрес у клиента смениться? Тут все то же самое. Как и в случаем физического адреса оконечного оборудования клиента. По сути - адрес не является параметром договора и может быть утвержден, например, доп. соглашением. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2008, 16:08 |
|
||
|
Создание пустого договора
|
|||
|---|---|---|---|
|
#18+
docomIP-адрес нужно выделить заранее, потому-что клиенту вместе с договором на подпись будет вручена памятка на подключение, где будут указаны его сетевые параметры. Я таки сомневаюсь в разумности такого подхода. Во-первых, я вообще не понимаю, зачем выделять адреса и почему бы не использовать dhcp. Во-вторых, я уверен в том, что клиент через полгода не найдет эту бумажку. Ну а в-третьих, я не очень понимаю, кто мешает послать ему емейл с новыми реквизитами. docomпросто тут 2 проблемы, первая - необходимо всегда помнить, что некоторые данные могут быть null, С практической точки зрения куда меньшая проблема, нежели "всегда помнить, что некоторые данные могут быть фиктивными". docomи вторая - как-то гарантировать целостность, т.е. например раз договор имеет статус "Пустой", то паспорт у клиента должен быть null, и запись в таблице места подключения должна отсутствовать. И в чем проблема? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2008, 16:08 |
|
||
|
Создание пустого договора
|
|||
|---|---|---|---|
|
#18+
Сергей Васкецов Налицо кривой БП. Может IP-адрес у клиента смениться? Тут все то же самое. Как и в случаем физического адреса оконечного оборудования клиента. По сути - адрес не является параметром договора и может быть утвержден, например, доп. соглашением. softwarer Я таки сомневаюсь в разумности такого подхода. Во-первых, я вообще не понимаю, зачем выделять адреса и почему бы не использовать dhcp. Во-вторых, я уверен в том, что клиент через полгода не найдет эту бумажку. Ну а в-третьих, я не очень понимаю, кто мешает послать ему емейл с новыми реквизитами. ну что я могу сказать - не я придумывал бизнес-правила. Насколько знаю, ситуация такая - все подключенные к сети дома имеют выделенные им диапазоны IP-адресов. Так что каждый пользователь может иметь адрес только из тех диапазонов, которые закреплены за домом. Адрес внутри сети, и внешний IP-адрес нужны для того, что-бы настроить подключение к локальной сети и Интернету (там есть авторизатор, который требует эти данные, так что динамически адреса вроде как не выделить, хотя я вообще-то не специалист по сетям :) Вот вы приехали к человеку, дали памятку, начинаете настраивать и обнаруживаете что указанный адрес уже занят. Ну можно наверно позвонить в офис, назначить новый адрес и исправить памятку, просто нафига :) Если адрес сразу зарезервирован, проблем имхо куда меньше. А так да, IP не относиться к договору как таковому и может в дальнейшем меняться. Он поэтому и написан на памятке, а не в договоре softwarer И в чем проблема? ну триггер там писать и все такое :) Я конечно с вами особо не спорю, сделать все можно, просто вообще-то такая проверка может оказаться довольно трудоемкой. Потому и спрашивал, может какие-то хитрые решения этого существуют, что-бы велосипед не изобретать ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2008, 16:49 |
|
||
|
Создание пустого договора
|
|||
|---|---|---|---|
|
#18+
docom softwarerНе, не ужас. Поверьте: "записи нет там, где она нужна" - на порядок меньшее зло, нежели "запись вылезла там, где она не нужна". Поэтому расставить в нужных местах outer joins - гораздо лучше, нежели отфильтровывать "почти всюду" фиктивные значения. просто тут 2 проблемы, первая - необходимо всегда помнить, что некоторые данные могут быть null, и вторая - как-то гарантировать целостность, т.е. например раз договор имеет статус "Пустой", то паспорт у клиента должен быть null, и запись в таблице места подключения должна отсутствовать.тут нет проблем и нечего тут помнить, да и проверка нужна обратная. Договор не может менять статус с "Пустой" на "Полный", пока не проставлены паспорт клиента, запись в таблице места подключения, etc. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2008, 17:23 |
|
||
|
Создание пустого договора
|
|||
|---|---|---|---|
|
#18+
docomну триггер там писать Нафига? docomпросто вообще-то такая проверка может оказаться довольно трудоемкой. Хм. Времени, которого мы потратили на этот разговор, хватило бы на наиболее трудоемкую реализацию нескольких таких проверок :) docomПотому и спрашивал, может какие-то хитрые решения этого существуют, Зачем хитрые, когда легко решается очевидными, и они уже названы в топике? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2008, 17:44 |
|
||
|
Создание пустого договора
|
|||
|---|---|---|---|
|
#18+
softwarer Нафига? а как вы собираетесь обеспечивать целостность данных между двумя таблицами ? К примеру в данном случае, требуется обеспечить что-бы поле "Пустой" было null только в том случае, если запись об адресе на данный контракт в другой таблице отсутствует. Т.е. например нельзя взять и просто "вручную" поставить true в таблице с контрактами. Как вы это будете делать без триггера ? softwarer Хм. Времени, которого мы потратили на этот разговор, хватило бы на наиболее трудоемкую реализацию нескольких таких проверок :) но принципиально-то ведь может создасться ситуация, когда проверка будет сложной, какой-нибудь очень навороченный объект попадется ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2008, 19:09 |
|
||
|
Создание пустого договора
|
|||
|---|---|---|---|
|
#18+
docomа как вы собираетесь обеспечивать целостность данных между двумя таблицами ? К примеру в данном случае, требуется обеспечить что-бы поле "Пустой" было null только в том случае, если запись об адресе на данный контракт в другой таблице отсутствует. Элементарно. Протянуть внешний ключ из "этой" таблицы в "другую" и написать check на "поля вместе null либо вместе заполнены". Если кроме того хотим обеспечить невозможность нескольких инсталляций по одному адресу, пишем еще unique. docomно принципиально-то ведь может создасться ситуация, когда проверка будет сложной, какой-нибудь очень навороченный объект попадется ... Принципиально может сложиться ситуация, когда надо месяц сидеть и решать задачу.... и я сразу могу сказать, что серебряной пули, решающей ее за тридцать секунд - пока не существует. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2008, 19:48 |
|
||
|
Создание пустого договора
|
|||
|---|---|---|---|
|
#18+
В своё время мы реализовали одну из вариаций EAV, где не было null-ссылок (а значит - не было outer join), но одновременно с этим null-ссылки "были". Получилось достаточно удобно, хотя, как и все EAV - иногда недостаточно быстро. ----------------------------------- Вперёд назад за лиловыми кроликами! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2008, 02:30 |
|
||
|
Создание пустого договора
|
|||
|---|---|---|---|
|
#18+
JustPT001В своё время мы реализовали одну из вариаций EAV, где не было null-ссылок (а значит - не было outer join) Меня перманентно удивляет постановка вопроса "главное, чтобы чего-то не было" при том, что встречается в самых разных вариациях - чтобы не было аутер джойнов, чтобы не было исключений.... я даже знаю один проект, где на административном уровне запретили пользоваться наследованием (в обычном ООП смысле этого слова). JustPT001Получилось достаточно удобно Хотелось бы увидеть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2008, 11:00 |
|
||
|
|

start [/forum/topic.php?fid=32&tid=1543835]: |
0ms |
get settings: |
8ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
35ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
81ms |
get tp. blocked users: |
2ms |
| others: | 208ms |
| total: | 374ms |

| 0 / 0 |
