отношения между продуктами и запасами

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

Какой из нижеприведенных вариантов подходит? Если нет, сообщите мне, почему и каково ваше предложение.

заранее спасибо

 **ПРОДУКТЫ - ЗАПАСЫ** 

На основе вышеперечисленных объектов:

* Если у меня есть отношение  `1: 1` , похоже, мне придется сократить запас
количество в той же строке, обновив строку с помощью инструкции  `UPDATE` .
* Если у меня есть отношение  `1: n` , похоже, мне нужно будет добавить новую строку
с обновленным количеством запасов в нем с помощью инструкции  `INSERT` .

 **ВАЖНЫЕ ПУНКТЫ** 

* Существовали бы одновременные пользователи для манипулирования запасами, такими как увеличение и/или уменьшение, поэтому важна точка  `[ACID] [1]` .
* `Сумма запаса`  - неотрицательное значение.

Зависит от того, чего вы пытаетесь выполнить.

Если вам нужен простой  **номер** , который описывает доступное количество продукта, просто сохраните его как поле в таблице продуктов. Обновление его в одном выражении является атомарным:

```
UPDATE PRODUCT
SET AMOUNT = AMOUNT + 
WHERE PRODUCT\_ID = 

```

Кроме того, вы можете сделать что-то вроде этого:

```
START TRANSACTION;

SELECT AMOUNT
FROM PRODUCT
WHERE PRODUCT_ID = 
FOR UPDATE;

(Calculate new amount.)

UPDATE PRODUCT
SET AMOUNT = 
WHERE PRODUCT\_ID = ;

COMMIT;

```

Обратите внимание на FOR UPDATE, который блокирует строку до COMMIT и предотвращает аномалии, которые в противном случае были бы возможны в параллельной среде.

Без ОБНОВЛЕНИЯ, просто регулярных гарантий ACID недостаточно. Например:

* Операция  **A**  ВЫБРАТЬ текущую AMOUNT, предположим, что она равна 5.
* Операция  **B**  ВЫБРАТЬ текущую AMOUNT, которая по-прежнему равна 5, поскольку никакая другая транзакция не совершила никаких изменений.
* В транзакции  **A**  добавляется 2 к сумме, в результате получается 7.
* Транзакция  **B**  добавляет 3 к сумме, в результате получив 8.
* Операция  **A**  ОБНОВЛЯЕТ строку до 7 и совершает транзакции.
* Транзакция  **B**  ОБНОВЛЯЕТ строку до 8 и совершает транзакции.

Внезапно итоговая сумма AMOUNT в таблице равна 5 + 3 = 8, хотя она должна была быть 5 + 2 + 3 = 10. Одно из изменений теряется - тот, кто совершает последние победы.

---

Если вам нужна история количества продуктов или нужно отслеживать отдельные «экземпляры» продуктов, тогда да, вам понадобится отдельная таблица в соотношении 1: N, которая может иметь свои собственные проблемы с блокировкой в параллельной среде.

---

>  Сумма запаса - это неотрицательное значение. 
> 
> 

К сожалению, MySQL не применяет ограничения CHECK, но для этого конкретного случая вы можете просто использовать один из  [UNSIGNED](https://dev.mysql.com/doc/refman/5.6/en/numeric-type- overview.html ) .



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

**in updation**  

in `mysql - update needs write lock` ,  

so ,**performance drain:** for many users the system would be as compared slow   
  

**in insert**  

**memory drain:** say for 100 user 100 rows may be for more updates 100 rows. 

Я думаю, что  `1: 1 отношение корабль лучше` , потому что   

 если вы передаете отношение  `1: n` , тогда,

для увеличения запасов:

```
-you 'll add new row .
-so for total stock 
       - you have to add all the subsequent rows,if new value you are inserting 
         is only the incremented amt 
       - or if it is the total increased amt the previous rows would not have
         any significance.

```

для уменьшения запасов,
одна и та же ,

```
-if the total decrement amt you are inserting then the previous data has 
 no significance,
-but if only decrement value is there , so for every user you have to put 
 a check over the total stock which you would get from many rows.

```