проектирование базы данных программно обрабатывает увеличивающееся поле идентификатора, масштабируемость - запутано - PullRequest
0 голосов
/ 06 мая 2010

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

Например, представьте эти идентификаторы заказа в последовательности: -

UK0001  
UK0002  
UK0003  
DE0001  
UK0004  
DE0002  

и т.д..

  1. через сгруппированный идентификатор PK MySQL / MyISAM

    • MySQL будет управлять этим автоматически, если поле страны и поле с автоматически увеличивающимся идентификатором используемый. Но MyISAM имеет некоторые присущие такие проблемы, как блокировка таблицы и эта функция кажется, что это особенность это доступно только в MyISAM, так движущийся движок базы данных не будет возможно с этим решением.
  2. Программный. Допустим, у нас есть два поля: order_id (глобальное авто колонка inc PK, управляемая БД), порядковый номер (для конкретной страны поле последовательного идентификатора поддерживается через код) и таблица также имеет столбец shop_id для привязки заказов в магазины.

Итак - после создания новой записи заказа, когда механизм БД назначил идентификатор новой записи, а вновь созданный идентификатор заказа был извлечен в коде как переменная $ newID

select order_number+1 as new_order_number from orders where order_id < $newID and shop_id = UK order by order_id desc limit 1

(это псевдокод / ​​sql кстати)

Вопросы:

  1. это реальное решение? Или есть более эффективный способ сделать это?

  2. Если в таблице содержится более 1 миллиона записей, будут ли дополнительные затраты на запрос при отправке заказа вызывать проблемы или нет?

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

С нетерпением ждем вашей помощи!

Спасибо

1 Ответ

0 голосов
/ 07 апреля 2011

Да, вы определенно на правильном пути. Установите для поля ORDER ID значение UNIQUE и сделайте то же самое, что вы пытались сделать. Добавьте оператор catch, если он не добавлен из-за ошибки UNIQUE, затем попытайтесь вставить его снова с тем же оператором, чтобы гарантировать, что идентификатор ORDER никогда не вставляется с одним и тем же идентификатором одновременно.

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