Прописка. Защита от дурака.

Разговоры на любые темы: вы можете обсудить здесь какой-либо сайт, найти единомышленников или просто пообщаться...
dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Прописка. Защита от дурака.

Сообщение dr.MIG » 06.02.2010 (Сб) 15:44

Необходимо вести базу пользователей, одной из характеристик пользователя является «Прописка». При этом необходимо, чтобы без особых проблем из этой характеристики можно было извлечь область, город/населенный пункт, домашний адрес, почтовый индекс. Необходимо исключить возможные ошибки пользователей при указании этих характеристик. Для этого можно использовать выпадающие списки Область -> Город/Населенный пункт. Есть ли где в свободном доступе полная база с детализацией населенных пунктов вплоть до улиц (интересует только РФ), например как база на основе которой работает, например http://www.moscowindex.ru/rus/?
Salus populi suprema lex

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Прописка. Защита от дурака.

Сообщение MIT » 06.02.2010 (Сб) 15:58

Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Re: Прописка. Защита от дурака.

Сообщение dr.MIG » 08.02.2010 (Пн) 22:30

Кажется оно. Огромное спасибо!
Salus populi suprema lex

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Re: Прописка. Защита от дурака.

Сообщение dr.MIG » 14.04.2010 (Ср) 21:13

При изучении структуры данной базы данных возникли некоторые вопросы. Каждый объект там идентифицируется цифровой строкой: СС РРР ГГГ ППП АА, где
СС – код субъекта Российской Федерации (региона);
РРР – код района;
ГГГ – код города;
ППП – код населенного пункта,
АА – признак актуальности адресного объекта.

Однако подобная структура вызывает некоторые опасения по поводу быстродействия — не затянется ли выборка подчиненных элементов — ведь для этого придется использовать в запросе Like для 192 тысяч элементов, содержащихся в базе. И не оптимальнее ли будет заменить это поле двумя — id (идентификатор элемента), pid (указатель на id родительского элемента)?
Salus populi suprema lex

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Прописка. Защита от дурака.

Сообщение alibek » 14.04.2010 (Ср) 23:07

Запрос Like для строк типа 'abc%' не сильно сказывается на производительности (при наличии индексов и с учетом того, что работа со строками медленнее работы с числами).
Замена на дерево вида ID-ParentID часть вопросов снимет, но добавит другие. Скажем, в таком дереве отобрать ветку со всеми потомками в одном запросе будет не совсем тривиальной задачей.
Так что выделяй задачи, в которых тебе нужны эти данные и сам определяй, какая схема для тебя будет оптимальной.
Lasciate ogni speranza, voi ch'entrate.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: Прописка. Защита от дурака.

Сообщение Денис » 15.04.2010 (Чт) 8:35

dr.MIG писал(а):не затянется ли выборка подчиненных элементов — ведь для этого придется использовать в запросе Like для 192 тысяч элементов, содержащихся в базе.

Я давно уже с КЛАДР не общался. Но кажется там так и есть:
dr.MIG писал(а):И не оптимальнее ли будет заменить это поле двумя — id (идентификатор элемента), pid (указатель на id родительского элемента)?


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

Сначала выбираем край/область, после этого становится доступен выбор района (значит районы, с ID других краев отсеиваются на этом этапе). Потом выбираем населенный пункт и тоже, пока не будет выбран район, населенные пункты недоступны. И так же с улицей.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Re: Прописка. Защита от дурака.

Сообщение Ramzes » 15.04.2010 (Чт) 11:19

alibek писал(а):Запрос Like для строк типа 'abc%' не сильно сказывается на производительности (при наличии индексов и с учетом того, что работа со строками медленнее работы с числами).
Замена на дерево вида ID-ParentID часть вопросов снимет, но добавит другие. Скажем, в таком дереве отобрать ветку со всеми потомками в одном запросе будет не совсем тривиальной задачей.
Так что выделяй задачи, в которых тебе нужны эти данные и сам определяй, какая схема для тебя будет оптимальной.

Поддерживаю, лучше как минимум вынести все кода в отдельные поля, как максимум в отдельные таблицы (и привести БД к 3-ей нормальной форме)

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: Прописка. Защита от дурака.

Сообщение Antonariy » 15.04.2010 (Чт) 11:40

Замена на дерево вида ID-ParentID часть вопросов снимет, но добавит другие. Скажем, в таком дереве отобрать ветку со всеми потомками в одном запросе будет не совсем тривиальной задачей.
C появлением CTE эта задача стала почти тривиальной, правда нужен 2008й MSSQL. А при использовании Nested Sets — чуть более, чем полностью, и база может быть любой.
Лучший способ понять что-то самому — объяснить это другому.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Прописка. Защита от дурака.

Сообщение alibek » 15.04.2010 (Чт) 14:02

Ramzes писал(а):Поддерживаю, лучше как минимум вынести все кода в отдельные поля, как максимум в отдельные таблицы (и привести БД к 3-ей нормальной форме)

Причем тут третья нормальная форма?
В записях четвертого уровня два родительских поля из трех избыточны. До 3НФ тут далеко.

Antonariy писал(а):C появлением CTE эта задача стала почти тривиальной, правда нужен 2008й MSSQL.

С одной стороны да. С другой — есть ведь и другие СУБД, помимо MSSQL2000, в которых такое дерево строить сложно.
Lasciate ogni speranza, voi ch'entrate.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: Прописка. Защита от дурака.

Сообщение Antonariy » 15.04.2010 (Чт) 14:25

помимо MSSQL2000
MSSQL2008
Я так и сказал. Но автор пока не озвучил название БД.
Лучший способ понять что-то самому — объяснить это другому.

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Re: Прописка. Защита от дурака.

Сообщение dr.MIG » 15.04.2010 (Чт) 14:36

Про NestedSets думал, но не хотелось бы заморачиваться здесь с этим в данном случае. Суть задачи сводится вот к чему: предоставить пользователю указать свое место жительства в строго указанном формате (регион-район-населенный пункт). Это необходимо для предоставления различных отчетов по регионам, районам или отдельным городам. Таким образом пользователь будет характеризоваться идентификатором населенного пункта. Т.е. выбор пользователей одного региона будет непростой задачей при стандартном подходе. Так может в рамках данной задачи проще не увлекаться нормализацией, а добавить пользователю вместо одной характеристики (идентификатор населенного пункта) сразу три — идентификатор региона, района и населенного пункта?

ADD: БД MySQL.
Salus populi suprema lex

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: Прописка. Защита от дурака.

Сообщение Antonariy » 15.04.2010 (Чт) 14:50

Вообще смысл задачи в недопущении ошибок, а как данные хранятся в базе — дело десятое. Если пользователь введет "кирпич" вместо "староколпакский пер.", никакие деревья и нормализация не помогут. В общем, решение следует искать в области пользовательских интерфейсов, а не структуры данных. Если не делать нередактируемых списков, ошибки будут в любом случае, даже если использовать аналог T9. Кстати, несколько полей с Т9 и запретом ввода данных, которых нет в базе, наиболее оптимальный вариант.
Лучший способ понять что-то самому — объяснить это другому.

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2941
Зарегистрирован: 31.08.2007 (Пт) 4:41

Re: Прописка. Защита от дурака.

Сообщение Proxy » 15.04.2010 (Чт) 17:49

и запретом ввода данных, которых нет в базе, наиболее оптимальный вариант.

Ну-ну... А где гарантии, что с момента появления базы в неком городе Урюпинске улица Копылёва не была переименована в Путинную и т.п. Это нерациональная загрузка технической поддержки проекта. Или где гарантии, что улица Блуцевич не была по ошибке написана как "ул. Блуцевича"? В моём городе такая улица в картах написана в первом варианте (т.к. Блуцевич таки девушка), во всяческих департаментах числится как ул. Блуцевича и т.д, а подписи на домах 50 на 50.

Ещё вопрос на засыпку (вероятно для прописки тоже имеет актуальность): связывались когда-либо с разработкой ГИС? Знаете ли вы, что в РФ связь физическое строение и адрес постройки - многие ко многим? Я вот недавно заметил, что большинство ГИС этого не предполагают и дома с двойными адресами в ГИСе имеют только один адрес. А так же существуют дома, имеющие один номер и один буквенный префикс (индекс ли)? Ещё на прошлом месте работы столкнулся с таким (два здания после реконструкции были объединены переходом. На карте это одно здание, а фактически их два. И нумерация квартир повторяется. Т.е. в одном доме квартира номер 2 встречается дважды).
Follow the white rabbit.

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Re: Прописка. Защита от дурака.

Сообщение dr.MIG » 15.04.2010 (Чт) 20:13

Proxy писал(а):Ещё вопрос на засыпку...

Да, об этом задумывался, но к счастью сами улицы не так актуальны и вполне достаточно простого ввода в произвольном форме. И раз уж речь зашла о пользовательском интерфейсе и полях ввода, то там существует еще одно узкое место — указание школы, где обучается регистрирующийся. Что можно придумать здесь, чтобы иметь возможность отобрать учеников одной школы конкретного населенного пункта. Ведь как показала практика одну и ту же школу назовут СОШ № 13, МОУ СОШ № 13, средняя общеобразовательная школа 13 и т.п. Можно это как-то побороть?
Salus populi suprema lex

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: Прописка. Защита от дурака.

Сообщение Денис » 15.04.2010 (Чт) 20:38

dr.MIG писал(а):Можно это как-то побороть?

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

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: Прописка. Защита от дурака.

Сообщение Antonariy » 15.04.2010 (Чт) 23:39

Proxy писал(а):
и запретом ввода данных, которых нет в базе, наиболее оптимальный вариант.

Ну-ну... А где гарантии, что с момента появления базы в неком городе Урюпинске улица Копылёва не была переименована в Путинную и т.п. Это нерациональная загрузка технической поддержки проекта. Или где гарантии, что улица Блуцевич не была по ошибке написана как "ул. Блуцевича"? В моём городе такая улица в картах написана в первом варианте (т.к. Блуцевич таки девушка), во всяческих департаментах числится как ул. Блуцевича и т.д, а подписи на домах 50 на 50.
Ну, я предложил вариант максимально защищенный от ошибки. А вообще, везде, где пользователи вводят данные своими кривыми руками, ошибки будут, это аксиома.

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

dr.MIG писал(а):Ведь как показала практика одну и ту же школу назовут СОШ № 13, МОУ СОШ № 13, средняя общеобразовательная школа 13 и т.п. Можно это как-то побороть?
Сделать жирнющую надпись, предписывающую вводить идентификатор школы начиная с цифр, типа "13, МОУ СОШ". И обеспечить это технически. Плюс T9 и изложенное выше.
Лучший способ понять что-то самому — объяснить это другому.


Вернуться в Народный треп

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 51

    TopList