Имеется простая структура списка операций, в которой ключ - порядковый номер операции, а значение - набор данных (на данном этапе несколько реализаций):
// Версия с объектом в значении
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 — и я отвечу: потому что логика максимально простая — мы можем только добавлять или читать данные (возможность обновления или удаления полностью отсутствует).