Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как хранить и иметь быстрый доступ к данным? (https://javascript.ru/forum/misc/84837-kak-khranit-i-imet-bystryjj-dostup-k-dannym.html)

webgraph 11.01.2023 14:46

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

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

:)

voraa 11.01.2023 15:11

Цитата:

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

А если есть '234.489274000000000'?
Их все таки как числа или как строки сравнивать?

webgraph 11.01.2023 15:20

Цитата:

Сообщение от voraa (Сообщение 549874)
А если есть '234.489274000000000'?
Их все таки как числа или как строки сравнивать?

Для проведения математических операций значение будет приводиться к виду BigInt. А потом снова в строку (ибо иначе bigint не хранится).

Т.е. по итогу после точки у всех value будет одинаковое количество знаков (или как вариант — хранить без точки, а в целых значениях, но то же в строке - т.к. bigint).

Поэтому думаю актуальнее сравнивать как строки?)

voraa 11.01.2023 15:28

Дробные нельзя в BigInt
А если без точки, то не понятно, где целая, где дробная, и как их складывать и вычитать
Цитата:

Сообщение от webgraph
Для проведения математических операций значение будет приводиться к виду BigInt.

Что должно получиться после приведения
'234.489274000000000'
'234.489274'
'23448.9274'
?

webgraph 11.01.2023 15:29

Цитата:

Сообщение от voraa (Сообщение 549876)
Дробные нельзя в BigInt

Это понятное дело. Суть в том, что после точки количество знаков у всех одинаковое.

webgraph 11.01.2023 15:33

Цитата:

Сообщение от voraa (Сообщение 549876)
Дробные нельзя в BigInt
А если без точки, то не понятно, где целая, где дробная, и как их складывать и вычитать

В общем все числа были приведены к виду BigInt :)) (примеры в шапке были отредактированы)

webgraph 11.01.2023 15:44

Цитата:

Сообщение от voraa (Сообщение 549876)
Дробные нельзя в BigInt
А если без точки, то не понятно, где целая, где дробная, и как их складывать и вычитать

Что должно получиться после приведения
'234.489274000000000'
'234.489274'
'23448.9274'
?

Ну, ваще:

'234.489274000000000' ->
234489274000000000

'234.489274' ->
234489274000000000

'23448.9274' ->
23448927400000000000

Т.е. в вашем случае было принято решение использовать 15 знаков после запятой — значит все числа в этой системе будут иметь 15 знаков после запятой. Это число знаков, очевидно, может быть выбрано только 1 раз.

voraa 11.01.2023 15:45

Цитата:

Сообщение от webgraph
Суть в том, что после точки количество знаков у всех одинаковое.

Т.е например 17 знаков на дробь и 17 знаков на целое
Итого строка длиной 34 знака.
И если целое меньше до дополняется нулями слева до 17 знаков, а дробная часть дополняется нулями справа до 17 знаков
Цитата:

Сообщение от voraa
Что должно получиться после приведения
'234.489274000000000'
'23448.9274'
?

Соответственно получаем строки
'0000000000000023448927400000000000'
и
'0000000000002344892740000000000000'

(Все равно не понятно, как их делить и умножать)

webgraph 11.01.2023 15:49

Цитата:

Сообщение от voraa (Сообщение 549880)
Т.е например 17 знаков на дробь и 17 знаков на целое
Итого строка длиной 34 знака.
И если целое меньше до дополняется нулями слева до 17 знаков, а дробная часть дополняется нулями справа до 17 знаков
Соответственно получаем строки
'0000000000000023448927400000000000'
и
'0000000000002344892740000000000000'

(Все равно не понятно, как их делить и умножать)

А зачем нули перед целыми добавлять О_о Этого делать не нужно.

Ну в общем, уже же решили, что сейчас все числа просто имеют тип BigInt, так что с дробными числами можно успокоиться))

voraa 11.01.2023 15:54

Цитата:

Сообщение от webgraph
А зачем нули перед целыми добавлять О_о Этого делать не нужно.

Т.е если надо сравнить на больше-меньше - надо сначала перевести в bigint? Просто как строки не получится.


Часовой пояс GMT +3, время: 15:31.