2010-05-01 10 views
0

Я смотрю на создание торгового решения, которое необходимо масштабировать. В настоящее время он извлекает 1-2000 заказов в среднем за день в разных страновых магазинах (например, uk, us, de, dk, es и т. Д.), Но этот порядок может составлять в 10 раз эту сумму через два года.таблица заказов с несколькими магазинами и порядковые номера заказов на основе магазина

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

Если все заказы существуют в одной таблице с глобальным идентификатором (auto num) и идентификатором страны (например, uk, de, dk и т. Д.), В каждом заказе стран также должен быть последовательный заказ. Таким образом, по сути, мы должны иметь глобальный идентификатор и идентификатор заказа на страну, причем идентификатор странного заказа является последовательным только для стран, например.

глобальный ID = 1000, страна = Великобритания, заказ страны ID = 1000
глобального ID = 1001, страна = DE, страна заказа ID = 1000
глобального ID = 1002, страна = DE, заказ страны ID = 1001
глобальный ID = 1003, страна = DE, заказ страна ID = 1002
глобальный ID = 1004, страна = Великобритания, заказ страна ID = 1001

глобального ID будет DB генерируется и не то, что я должен был бы беспокоюсь о. Но я думаю, что мне нужно будет сделать запрос, чтобы получить текущий идентификатор страны на основе идентификатора + 1, чтобы найти следующий порядковый номер. Меня интересуют две вещи: 1) время запроса, когда таблица имеет потенциально миллионы строк данных, и я делаю чтение перед записью, 2) вероятность столкновения идентификационных номеров из-за одновременной записи/чтения.

С таблицей MyISAM вся таблица может быть заблокирована, в то время как последний заказ страны + 1 извлекается для предотвращения столкновений идентификационных номеров.

Мне интересно, знает ли кто-нибудь о более элегантном решении?

Приветствия, imanc

ответ

0

Существует способ сделать это.

INSERT INTO test123 (`Country`, `Country order code`) 
SELECT 'UK', MAX(`Country order code`) + 1 
FROM test123 
WHERE `Country` = 'UK' 

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