2016-12-08 3 views
0

Я проектирую систему, в которой у меня есть несколько магазинов, где каждый магазин должен иметь свой собственный набор последовательных номеров для своих счетов-фактур. Очевидно, что мой основной идентификационный столбец будет последовательным для всех счетов-фактур в системе, поэтому, очевидно, мне понадобится еще один столбец для хранения этого номера магазина «конкретный магазин». Каков наилучший способ хранения и получения следующего идентификатора для данного номера магазина? Например, было бы безопасно просто получить это прямо из таблицы счетов-фактур, сделав что-то вроде: SELECT MAX(INV_NUM) FROM INVOICES WHERE SHOP_ID = # и добавить его, а затем создать новую запись счета-фактуры? Или возникнут проблемы с синхронизацией, если два экземпляра моего сценария должны были запускаться одновременно? Например, первый скрипт извлекает следующий идентификатор, но прежде чем он получит возможность создать новую запись счета, второй экземпляр запрашивает следующий идентификатор и получает тот же самый, что и первый скрипт ... Я тогда думал о том, чтобы просто сохранить последнее использовать номер в отдельной таблице, и как только я запрошу следующий номер счета, немедленно напишите новый номер следующего заказа и сохраните его, чтобы время между получением следующего номера заказа и созданием записи, на которую будет рассчитываться следующий запрос, будет абсолютный минимум ... буквально три строки кода:Вторая колонка с порядковыми номерами в базе данных

$nextId = $shop->getLastId() + 1; 
$shop->setLastId($nextId); 
$em->persist(); 

счетов-фактур

------------------------------ 
| ID | INV_NUM | SHOP_ID | 
------------------------------ 
| 1 |  99 |  1 | 
| 2 |  100 |  2 | 
| 3 |  100 |  1 | 

Магазины

------------------- 
| ID | LAST_ID | 
------------------- 
| 1 |  100 | 
| 2 |  100 | 
+0

Вот один из вариантов, если вы используете MyISAM: http://stackoverflow.com/questions/677542/auto-increment-by-group –

+0

Обычно для этого используется триггер. –

+0

@GordonLinoff Но как он мог использовать триггер на одной таблице? –

ответ

1

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

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