База данных для хранения списка словарей

0

Мне нужен способ хранения следующей структуры в базе данных. Контекст заключается в том, что у меня есть таблица, которая включает список ресурсов, и мне нужно блокировать эту таблицу, когда я выполняю операции для предотвращения одновременной записи.

ProjectID: abcd Lock: False Ресурсы: [{Ресурс: CPU AvailableQuota: 50 UsedQuota: 35}, {Ресурс: StaticIps AvailableQuota: 70 UsedQuota: 45}]

Я думал о том, чтобы поместить его в базу данных MySQL, но не могу придумать подходящий способ вставить список, чтобы мы могли заблокировать поле "ProjectId".

Любые указатели на базу данных/хранилище данных, которые позволяют эту форму размещения вложенных данных?

Теги:
database
redis

1 ответ

1
Лучший ответ

В MySQL вы можете создать таблицу со следующими столбцами.

ProjectId         VARCHAR(100)
ResourceName      VARCHAR(100)
AvailableQuota    INT
UsedQuota         INT

Столбцы ProjectId и ResourceName являются составным первичным ключом.

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

   BEGIN TRANSACTION;
   SELECT ResourceName, AvailableQuota, UsedQuota
     FROM table
    WHERE ProjectId = 'whatever'
     LOCK IN SHARE MODE;
      /* do whatever you need to do */
   COMMIT;

С другой стороны, если вам нужно изменить данные, вы можете делать такие вещи.

   BEGIN TRANSACTION;
   SELECT ResourceName, AvailableQuota, UsedQuota
     FROM table
    WHERE ProjectId = 'whatever'
     FOR UPDATE;
      /* do whatever you need to do */
    UPDATE table SET AvailableQuota=AvailableQuota - 10,
                     UsedQuota=UsedQuota + 10
     WHERE ProjectId = 'whatever' AND ResourceNme = 'something'
   COMMIT;

Когда вы используете эти так называемые блокирующие чтения в транзакции таким образом, другие клиенты MySQL будут ждать, пока вы не выполните операцию фиксации.

Избегайте таблиц MyISAM для этого; они не поддерживают транзакции.

  • 0
    Я удивлен качеством этого ответа. Спасибо, это похоже на мой случай использования!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню