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

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

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

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

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

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

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

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

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

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

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

1
nl ja de
@MitchWheat Почему вы проголосовали, чтобы закрыть вопрос как «не настоящий вопрос»? Это совсем не самый оригинальный вопрос, но это определенно вопрос.
добавлено автор Branko Dimitrijevic, источник

2 ответы

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

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

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 .

2
добавлено
Я читал блокировки на сайте dev.mysql.com и узнал, что вы говорите, это путь. Таким образом, результат 1: 1 с FOR UPDATE .
добавлено автор BentCoder, источник

он зависит от 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.
1
добавлено
DBA - русскоговорящее сообщество
DBA - русскоговорящее сообщество
1 345 участник(ов)

Общаемся и обсуждаем темы, посвященные DBA, PostgreSQL, Redis, MongoDB, MySQL, neo4j, riak и т.д. См. также: @devops_ru, @kubernetes_ru, @docker_ru, @nodejs_ru Рекомендуем сразу отключить уведомления, чтобы пребывание здесь было полезным и комфортным.

MySQL
MySQL
995 участник(ов)

The group is about MySQL. For code use hastebin.com. Admin: @smlkw

SqlCom.ru - Стиль жизни SQL
SqlCom.ru - Стиль жизни SQL
908 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только MS SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz). Предложения в @sql_ninja

dbGeeks
dbGeeks
545 участник(ов)

Чат про базы данных, их устройство и приемы работы с ними. Разрешаются любые адеватные дискуссии в рамках тематики чата.

SQL_Ninja
SQL_Ninja
340 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz)

Разработка СУБД
Разработка СУБД
143 участник(ов)