2012-06-28 3 views
1

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

У меня может быть несколько носителей, поэтому я ищу гибкое решение. И есть 2 способа оплаты - ХПК (наличные) и предоплаченные (нетто-банковские).

Список почтовых индексов доставки от одного из перевозчиков имеет 2775 записей для метода ХПК и 4 139 записей для предоплаченной оплаты.

Дизайн # 1 (Благодаря этому answer)

преобразовать прямой список для диапазонов (например, {1,2,3,5,8,9} => {(1,3), (5 , 5), (8,9)}), и имеют схемы -

carrier 
     id(int) | name (varchar) 

cod_zipcodes 
     start(int) | end(int) | carrier(fk::carrier.id) 

prepaid_zipcodes 
     start(int) | end(int) | carrier(fk::carrier.id) 

на преобразовании в диапазонах предоплаченный Почтовые индексы сократилась до 1,593 (38%) и трески Почтовые индексы сократилась до 842 (30%).

Дизайн # 2

cod_zipcodes 
    zipcode(int) 

prepaid_zipcodes 
    zipcode(int) 

В основном это дизайн просто есть список, как это. Если есть несколько носителей, я объединяю список. Поэтому я теряю информацию, которую перевозчик отправляет для определенного почтового индекса. Но это не проблема (но если она будет разобрана, это тоже не проблема!). Я просто хочу найти базу данных, что zipcode, введенный клиентом, находится в нашем разрешенном списке.

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

Спасибо!

+0

Будучи тем, что '1' не является почтовым индексом, у вас есть таблица почтовых индексов? И что '1' на самом деле просто ключ к этой таблице? Если да, то эта таблица zip-кода постоянно фиксируется или могут быть добавлены или удалены zip-коды из этой таблицы? И я предполагаю, что id id auto_increment, что означало бы, что новый zip-код не вставлен с идентификатором, близким к zip-кодам, которые похожи на него? – MatBailie

+0

@ Dems: В настоящее время у меня есть только 2 текстовых файла с почтовыми индексами, по одному на каждой строке. В вопросе я только что привел пример, чтобы показать, как я строю диапазоны. Список zip-кодов для носителя может измениться, но нечасто. Но тогда мы можем добавить или переключить носителей, опять же это должно быть редко. да id в дизайне 1 - это автоматическое увеличение. –

ответ

1

Первый проект, вероятно, самый компактный; его можно оптимизировать, добавив индекс охвата по start и end. Вы также можете комбинировать оба вида оплаты, как так:

zipcodes 
    start(int) | end(int) | carrier(fk::carried.id) | cod (0, 1) | prepaid (0, 1) 

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

Не пытайтесь быть умными и объединить диапазоны в зависимости от того, доступны ли cod и prepaid; вы можете вводить несколько диапазонов с различной доступностью для оператора и типа оплаты. Для того, чтобы запросить их нужно использовать:

SELECT COUNT(cod), COUNT(prepaid) 
FROM zipcodes 
WHERE start <= :start AND :end <= end 

Это даст одну строку, содержащую наличие cod и/или prepaid для конкретного почтового кода (хотя это может соответствовать строке более одной базы данных

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


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

zipcodes 
    zipcode | cod (0, 1) | prepaid(0, 1) 

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


Если обновления встречаются редко, и вы не возражаете против того, чтобы весь стол упал, когда это произойдет, я бы порекомендовал второй вариант. Добавляя cod и prepaid типы в каждой строке, а не в две отдельные таблицы, вы можете использовать первичный ключ для более быстрого поиска по сравнению с решением диапазона.

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

+0

Ваша первая идея потенциально будет использовать больше места, чем использование двух таблиц. * (Не во всех случаях, но, возможно, в некоторых.) * Но слияние потенциально несвязанного диапазона вы потенциально будете фрагментировать все диапазоны на гораздо меньшие части. 'COD {2-4}' плюс 'PRE {1-2}' плюс 'PRE {4-5}' => 5 разных разных диапазонов одного почтового индекса каждый. – MatBailie

+0

@ Да, да, возможно, догадаться, что ОП знает данные лучше нас, поэтому я надеюсь получить от него обратную связь :) –

+0

@Jack: +1 Здесь вы можете получить доступ к прямому списку, а также диапазонам для ХПК : https://www.box.com/s/f60662e3b5042c965673. Мой старший выступает за второе решение. Так что, возможно, слияние двух таблиц будет в порядке (?). Однако я не уверен в этом. –

Смежные вопросы