Нормализация / проверка международных наборов данных в базе данных? - PullRequest
13 голосов
/ 27 сентября 2010

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

Глядя на систему телефонных номеров, можно подумать, что это просто, но на самом деле это не так. В Северной Америке у нас обычно есть формат 1-222-333-4444 для вызова людей. Это, конечно, делится на ваш международный телефонный код, код города, префикс обмена и номер строки. Проблема: реальные телефонные номера ограничены, в США существует около 220 кодов городов из 1000 возможных, каждый код города имеет ограниченное количество обменов, а номера линий ограничены для конкретного использования в этой стране (например, шаблоны с 911 ограничены, только около 3/4 из 10000 используются). Отнесите это в Великобританию, у них есть собственный набор правил для номеров строк, таких как резервирование большей части блока 0300-0399 для конкретного использования и другие ограничения. Международные коды также ограничены. Нормализация кодов городов, обмены и сдача проверка данных на телефонные номера только что стала сложной. Я не буду вдаваться в подробности о том, когда мы пойдем в места, которые не являются частью схемы NPA , но давайте просто определим, что мы не можем доверять североамериканскому шаблону, отбросим его назад и назовем его день.

Как мы нормализуем для таких вещей? Как мы проверяем данные? Как мы имеем дело с этими, казалось бы, специальными внутренними кодами или инструкциями для внутреннего набора?

Международные адреса не намного лучше, различия между не только сохраненными данными, но и форматами вывода не одинаковы по всем направлениям. Как мы имеем дело с международными почтовыми кодами, когда в Канаде используется формат A1A1A1, а в США есть такая система, как 55555 [-4444]?

У меня возникает соблазн просто написать классы для каждой из этих ситуаций, когда я с ними сталкиваюсь, сохранить их в базе данных как XML / JSON / подобные, но тогда как мне связать поля и легко искать в моем контенте? Я не хочу заканчивать тем, что создал таблицу столов тысяч столов для каждой страны. Я хочу легко масштабируемое решение, где я могу нормализовать свои адреса и проверить содержимое. Это слишком много, чтобы спросить?

Ответы [ 3 ]

8 голосов
/ 05 ноября 2010

Способ решения этой проблемы может быть следующим:

принять три представления адресов / телефонных номеров / почтовых индексов и т. Д.

  1. Первое представление - это представление адресов(скажем) в виде нескольких строк текста.

  2. Второй вид - это адресные теги (подробнее об этом ниже).

  3. Третье представление - это правила проверки адресов

Другие компоненты, необходимые для этого подхода, являются общей процедурой (класс /триггер) для проверки;процедура форматирования для печати;и база правил вместе с механизмом администраторов для обновления правил проверки.Правило «catchall», которое говорит, что это действительный адрес - он был проверен вручную - даже если он не соответствует ни одному из правил вашей базы правил.

Компоненты: 1 Адрес состоит из нескольких строк каждаяиз которых есть связанный порядковый номер и количество тегов (обычно один).Можно также связать с адресной строкой набор правил и версий правил, по которым они были проверены, но это уточнение, которое зависит от ваших скоростей обновления / вставки / расчета.

2 Адрестеги - это как город;городок;номер дома;и определить разные строки адреса.Возможно иметь адресную строку, которая не имеет каких-либо тегов, но в этом случае возможны только общие поиски (например, для Нью-Йорка) по полному набору строк.Поиск "City = New York") невозможен.

3 Правила написаны на языке, специфичном для домена.Это может быть регулярное выражение;специфический для вас язык;Ваш обычный язык разработки (хотя это, вероятно, наименее полезный подход, поскольку языкам программирования может быть трудно точно и точно представлять правила того типа, о котором я говорю. Пример репрезентативных правил может быть (в связи с вашим описаниемПочтовые индексы США) - первые пять символов должны состоять из цифр.

первые пять символов представляют «код города».

почтовый индекс должен быть последней строкой адреса.

Правила будут разделены на группы и наборы (например, адреса США). Правила должны иметь возможность ссылаться на другие правила, а также на данные адреса.

  1. Ваши потребности в проверке правильностивзять строки адреса и применить к нему правила (обычно с помощью набора). Он вернет логический - действительный или недействительный адрес и, необязательно, набор правил, с которыми он проверен.

  2. Процедура печати снова применит соответствующий набор правил (возможно, отличный от вашего набора проверки) кданные адреса для предоставления отформатированного адреса.

Я надеюсь, что другие компоненты очевидны из общего подхода.

Этот подход предназначен для решения этих проблем, определенных в вашемвопрос:

  1. Разделение телефонных кодов.

  2. Ограниченное количество возможных используемых кодов города.

  3. Блоки телефонных номеров, зарезервированных для определенных целей.

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

  5. Я настоятельно рекомендую НЕ добавлять классы для каждого варианта - это не масштабируется и не поддерживается.

  6. Поиск подробно описан ниже.

  7. Избегайте таблиц монстров - скорее всего, будет база правил или порядка сотен или менее тысяч правил.к фактическим данным.

  8. Решение является масштабируемым - можно просто добавить или изменить правила.

, а также решить некоторые связанные с этим проблемы.

  1. Даже если вы можете применять правила проверки к национальным форматам адресов, всегда будут исключения из стандартов для конкретной страны. Мой собственный адрес является примером - я живу на лодке, и мне нужна дополнительная информация, включенная в мой адрес, помимо стандартного адреса почтового отделения. Подобные аномалии всегда могут нуждаться в ручном вмешательстве - следовательно, это правило принимается ручным вмешательством.

  2. В разных странах разные порядки адресов - например, в Китае пишутся адреса: Страна; Почтовый индекс; Город; Городская зона; Название улицы; Номер дома; Имя человека.

  3. Принятие первого адреса из области, в которой у вас нет правил, и правила страны отличаются от тех, которые вы записали.

  4. Люди, желающие использовать (например, офис) адрес, отличный от «своего» адреса.

  5. Конкретные индивидуальные адресные проблемы - кто-то, желающий скрыть свою переписку от своих родных и близких.

  6. Решение может быть распространено на подобные проблемы - например, обращение к человеку. Это может включать названия - Dr, Rev и т.д .; множественные дефисные имена (ffoulkes-symthe); квалификации (CPA, BSc и т. д .; семейные квалификации (третий и т. д.), а также различные способы присвоения имен в зависимости от культуры личности (люди на индийском субконтиненте часто не имеют фамилии, и у каждого, очевидно, будет своя фамилия ).

  7. Изменения в правилах адресации (например, добавление нового почтового индекса для новой разработки) могут быть сделаны легко и быстро.

Проблемы, которые все еще возникают:

  1. Поиск будет несколько более сложным - требуется поиск по всем строкам и связанным тегам адресов, а не по конкретным адресным полям

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

EDIT:

Я не знал о BigTable, когда писал свой ответ. После очень быстрого взгляда на это, похоже, это очень похожая концепция. Что касается его реализации в разработке ACID, я думаю, что это возможно для контактного набора данных и для базы данных правил. Из своего опыта я знаю, что он легко масштабируется до 5 * 10 ^ 7 наборов контактных данных в такой среде (хотя с фоновой, не критичной ко времени проверкой контактных данных).

При рассмотрении случая ACID / SQL моё использование слова «представление», возможно, привело к тому, что заяц ушел в направлении, которое я не намеревался. Более подходящим словом может быть обзор или перспектива (что-то без реляционной модели или прикрепленной загрузки СУБД). Фактически я бы рассматривал каждую из вещей, которые я назвал представлением, как таблицу кандидатов.

Я изложил эскиз схемы для моего подхода, чтобы помочь обсуждению. Эта схема использует некоторые соединения M: N, которые, очевидно, были бы нормализованы в реализации в виде ассоциативных таблиц. Это оставлено в качестве упражнения для читателя :-). Я поместил несколько примеров атрибутов и данных в некоторые из таблиц.

alt text

В эскизе редактирование набора правил; Правило; и правила, относящиеся к другим правилам (административное приложение), очевидно, могут быть выполнены со свойствами ACID с помощью операций SQL Normal CRUD над пользователем адреса; Адрес; и Адресная строка также может быть выполнена способом ACID / SQL, принимая адресные строки как вводимые пользователем. Вы можете выполнить некоторую предварительную обработку транзакции, чтобы отделить (в моем примере) номер дома от названия дороги и, следовательно, потерять правило «название дороги». Другая предварительная обработка, которая, вероятно, будет полезна, - это стандартизация капитализации, хотя это также может быть частью этапа проверки. Также можно просто принять полную строку «9 Richmond Road» в качестве входных данных и отметить ее как «Требуется проверка». В любом случае нет проблем (о которых я знаю) в отношении этой транзакции ACID.

Где мне не совсем понятно, как проверка и последующие теги могут быть включены в транзакцию ACID / SQL. Похоже, что для выполнения шага проверки ACID может потребоваться упорядочить применение тестирования по наборам правил (сначала проверяются наиболее распространенные случаи и прекращается при успешной проверке). Кроме того, для проверки транзакции ACID может потребоваться проверка только по вашему наиболее распространенному случаю, при этом остальные будут помечены как «Требуется проверка», что затем будет выполнено в качестве фоновой задачи.

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

Между прочим, эта схема эскиза идет лишь частично к полной нормализации. Как показано, каждый адрес имеет свою собственную последовательность адресных линий, и нет никакой нормализации данных за пределами отдельных строк в качестве входных данных (плюс или минус любая предварительная обработка, которую вы выбираете делать). Можно пойти еще дальше - сделав связь между адресом и адресной линией M: N и убедившись, что поле Line таблицы Address Line является ее первичным ключом.

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

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

Более важной причиной является то, что некоторые из источников этой идеи являются конфиденциальными или секретными. В моей рабочей карьере часть моей работы заключалась в том, чтобы быть в курсе технологических разработок и прогнозировать влияние технологий на бизнес через десять лет. Это включало посещение исследовательских лабораторий и обсуждение с ведущими исследователями различных тем. Хотя я сам не являюсь первоклассным исследователем, я, похоже, очень хорошо синтезирую исследовательские усилия других. Тем не менее, при этом я всегда работал в условиях коммерческой конфиденциальности и / или военной тайны. Ни один из моих ответов не нарушил эти условия. В результате я могу дать лишь расплывчатые указания относительно того, как была получена информация.

Мои источники:

  1. семинар, проведенный C J Date в IBM, для изучения дальнейших достижений нормализации и реляционной модели (НЕ реляционной модели, реализованной в SQL). Это включало исследование пятой (?) И шестой (?) Нормальных форм.

  2. серия обсуждений с техническим персоналом Oracle в течение определенного периода времени, обсуждение метаданных; мета-метаданные; и другие подобные обобщения.

  3. переговоры с военным научно-исследовательским учреждением в Великобритании. Хотя это было несколько лет назад, я не уверен, было ли что-либо опубликовано по темам, которые мы обсуждали.

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

EDIT:

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

В то время как есть обновления, которые нужно сделать, чтобы пометить / проверить правильность, большая часть работы - это чтение и сравнение. Как таковой, он является главным кандидатом на оптимистическую блокировку. В псевдокоде это будет выглядеть так:

Start read transaction
  Read set of address lines where one or more lines are "Needs Validation"
  Read all rule set names
  Read all rule lines which belong to the first rule set
  If read is not successful then abandon and start process again
End read transaction
Do while address not validated and not end of rule sets
  If set of address lines validates against first rule set then 
    prepare transaction by allocating the tags to be applied to each line of the 
    address and temporarily recording the rule set that has validated the address
    Start validation transaction
      Read same set of address lines and rule set (all fields)
      Is the address and the rule set identical to what was obtained in the read
      transaction?
      If identical then
        create appropriate set of Tag Usage records
        if successful then 
          commit validation transaction
          end overall process
        if not successful or 
        if not identical then
          rollback validation Tag and Tag Usage 
            ** This is the point where there might be problems if the rule set has 
            changed since reading it. The ordering may have changed due to amendment 
            deletion or creation of rule sets. This is the reason for the read of all 
            the read set names initially. However if there is such a change one can 
            afford to fail to validate and move on, aiming to come back to this address 
            later.
    End of validation transaction
    Start read transaction
      Read rule lines which belong to the next rule set
    End read transaction
End while loop
If end of rule sets reached and address not validated
  begin create Tag Usage transaction
    create tag usage pointing to Tag "Manual Intervention needed"
  end create Tag Usage transaction

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

0 голосов
/ 08 ноября 2010

Если бы я реализовал это, я бы сохранил номера телефонов, почтовые индексы и т. Д. Как обычные строки. В частности, данные должны храниться в формате, который нужен конечному пользователю. (Предполагая, что каждый конечный пользователь имеет одинаковые потребности.) Например. имея немецкий адрес: "Roadname 123", адрес в США? "123 Roadname". Делая то же самое для почтовых индексов, объедините их с названием города. Вы можете сохранить адреса в виде address_line_1 (название улицы, номер дома в конкретной стране, в которую входит пользователь), address_line_2 (почтовый индекс, название города ...).

Если вам все еще нужно искать в вашей базе данных конкретные почтовые индексы, вы можете написать регулярное выражение или даже функцию для этого. Учитывая названия городов, вы можете стереть их с адреса address_line_2, и с большой вероятностью у вас будет почтовый индекс.

Я думаю, что написание проверок для каждой страны должно быть огромной работой, это 200 стран ... Как вы можете быть уверены, что не пропустили некоторые местные соглашения? Вы можете написать функцию eq, которая, например, оценивает eq ("ABCDE-34", "ABCDE.34") == true.

Хотя я не вижу смысла в написании проверок на стороне клиента и на стороне сервера. Даже если клиент является веб-браузером, вы можете использовать проверки сервера через AJAX.

В конце концов, это зависит от используемой СУБД (поддержка хранимых процедур Java?), Вашего клиентского языка ... Также как вводятся данные (вводятся ли они очень неточно? В веб-браузере?) И что ты хочешь с этим делать. (Планируете ли вы вводить в Skype номера телефонов из вашей базы данных или они прочитаны людьми, которые набирают их в своем телефоне?) Вам нужно выполнить какие-то определенные операции соединения? И, конечно, это зависит от того, сколько человеко-часов вы сможете потратить на решение этой проблемы ...

0 голосов
/ 05 ноября 2010

Возможно уже ответил по крайней мере для телефонных номеров. Вы можете сделать что-то подобное для почтовых индексов.

...