Показать сообщение отдельно
  #1 (permalink)  
Старый 11.01.2023, 14:46
Аватар для webgraph
Профессор
Отправить личное сообщение для webgraph Посмотреть профиль Найти все сообщения от webgraph
 
Регистрация: 14.11.2014
Сообщений: 186

Как хранить и иметь быстрый доступ к данным?
Имеется простая структура списка операций, в которой ключ - порядковый номер операции, а значение - набор данных (на данном этапе несколько реализаций):

// Версия с объектом в значении
const operations_objects = new Map([
        [0, {
            from: 'e3d08a24-971f-4e5b-b646-a9decd12f05d', // UUID от кого
            to: 'd82bbb1d-0ab0-4d4d-8f97-41ddf6460c41',  // UUID кому
            value: '500000000',  // сколько (может быть уникальным значением) и принципиально строковое значение BigInt
            total_from: '100000000', // сколько осталось у отправителя
            total_to: '500000000', // сколько стало у получателя
            time: 1673357366 // дата проведения операции в секундах (от 01.01.1970)
        }],
        [1, {
            from: 'bd166b6d-381d-4109-9b4b-7a48a26b4119',
            to: 'ef59025a-165d-407e-831b-ab3464ae3861',
            value: '300000000',
            total_from: '700000000',
            total_to: '400000000',
            time: 1673357377
        }]
    ]);

//ИЛИ

// Версия со строкой в значении
const operations_strings = new Map([
        [
          0, 
          'e3d08a24-971f-4e5b-b646-a9decd12f05d d82bbb1d-0ab0-4d4d-8f97-41ddf6460c41 500000000 100000000 500000000 1673357366'
        ],
        [
          1,
          'bd166b6d-381d-4109-9b4b-7a48a26b4119 ef59025a-165d-407e-831b-ab3464ae3861 300000000 700000000 400000000 1673357377'
        ]
    ]);


1. По итогу необходимо иметь мгновенный доступ к значениям value (типа есть ли такое значение у получателя операции)

// Псевдопример:

operations.has('uuid-8a24-971f', '234489274'); // есть ли у участника 'uuid-8a24-971f' операция, в которой параметр value равен '234489274'

// ИЛИ

// как вариант поиск значения вообще по всем операциям (может так проще будет..)

// Псевдопример:

operations.has('234489274'); // типа есть ли вообще операция, в которой параметр value равен '234.489274'


2. Получить значение total_from или total_to

// Псевдопример:
operations.total('uuid-9b4b-7a48'); 

// типа найдёт самую последнюю операцию, где есть 'uuid-9b4b-7a48', определит кто он — from или to и выведет total_from или total_to


3. Вывести список всех операций (или их часть) по конкретному участнику

// Псевдопример:

operations.get('uuid-9b4b-7a48', 100); 

// типа выведет последние 100 операций с участником 'uuid-9b4b-7a48'


У меня была идея, что может следует каждый параметр операции вообще в отдельных Map хранить (по типу колонок) — но это актуально лишь для уникальных ключей. Например, если принудительно сделать параметр value UNIQUE — то, теоретически, можно создать Map, где ключом будет значение value, а значением — порядковый номер транзакции, типа

//
const values = new Map([
        ['234434505', 0],  // в ключе — значение value, а в значении — номер операции 
        ['250400000', 1]
        // и т.д.
]);

// при чем в таком случае из структуры operations можно вообще тогда убрать параметр value — потому что он будет вынесен в отдельную колонку

// НО
// по итогу при общем большом количестве операций думаю могут возникнуть трудности. и оптимальнее все таки искать value у конкретного участника: 

//operations.has('uuid-8a24-971f', '234489274');

// но это только предположение..



И вы можете спросить — а зачем хранить в операциях параметры total_from и total_to — и я отвечу: потому что логика максимально простая — мы можем только добавлять или читать данные (возможность обновления или удаления полностью отсутствует).


Последний раз редактировалось webgraph, 11.01.2023 в 15:34.
Ответить с цитированием