|
Как хранить и иметь быстрый доступ к данным?
Имеется простая структура списка операций, в которой ключ - порядковый номер операции, а значение - набор данных (на данном этапе несколько реализаций):
// Версия с объектом в значении 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 — и я отвечу: потому что логика максимально простая — мы можем только добавлять или читать данные (возможность обновления или удаления полностью отсутствует). :) |
Цитата:
Их все таки как числа или как строки сравнивать? |
Цитата:
Т.е. по итогу после точки у всех value будет одинаковое количество знаков (или как вариант — хранить без точки, а в целых значениях, но то же в строке - т.к. bigint). Поэтому думаю актуальнее сравнивать как строки?) |
Дробные нельзя в BigInt
А если без точки, то не понятно, где целая, где дробная, и как их складывать и вычитать Цитата:
'234.489274000000000' '234.489274' '23448.9274' ? |
Цитата:
|
Цитата:
|
Цитата:
'234.489274000000000' -> 234489274000000000 '234.489274' -> 234489274000000000 '23448.9274' -> 23448927400000000000 Т.е. в вашем случае было принято решение использовать 15 знаков после запятой — значит все числа в этой системе будут иметь 15 знаков после запятой. Это число знаков, очевидно, может быть выбрано только 1 раз. |
Цитата:
Итого строка длиной 34 знака. И если целое меньше до дополняется нулями слева до 17 знаков, а дробная часть дополняется нулями справа до 17 знаков Цитата:
'0000000000000023448927400000000000' и '0000000000002344892740000000000000' (Все равно не понятно, как их делить и умножать) |
Цитата:
Ну в общем, уже же решили, что сейчас все числа просто имеют тип BigInt, так что с дробными числами можно успокоиться)) |
Цитата:
|
Часовой пояс GMT +3, время: 15:31. |
|