Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #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.
Ответить с цитированием
  #2 (permalink)  
Старый 11.01.2023, 15:11
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,750

Сообщение от webgraph
operations.has('uuid-8a24-971f', '234.489274'); // есть ли у участника 'uuid-8a24-971f' операция, в которой параметр value равен '234.489274'
А если есть '234.489274000000000'?
Их все таки как числа или как строки сравнивать?
Ответить с цитированием
  #3 (permalink)  
Старый 11.01.2023, 15:20
Аватар для webgraph
Профессор
Отправить личное сообщение для webgraph Посмотреть профиль Найти все сообщения от webgraph
 
Регистрация: 14.11.2014
Сообщений: 186

Сообщение от voraa Посмотреть сообщение
А если есть '234.489274000000000'?
Их все таки как числа или как строки сравнивать?
Для проведения математических операций значение будет приводиться к виду BigInt. А потом снова в строку (ибо иначе bigint не хранится).

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

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

Последний раз редактировалось webgraph, 11.01.2023 в 15:28.
Ответить с цитированием
  #4 (permalink)  
Старый 11.01.2023, 15:28
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,750

Дробные нельзя в BigInt
А если без точки, то не понятно, где целая, где дробная, и как их складывать и вычитать
Сообщение от webgraph
Для проведения математических операций значение будет приводиться к виду BigInt.
Что должно получиться после приведения
'234.489274000000000'
'234.489274'
'23448.9274'
?

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

Сообщение от voraa Посмотреть сообщение
Дробные нельзя в BigInt
Это понятное дело. Суть в том, что после точки количество знаков у всех одинаковое.
Ответить с цитированием
  #6 (permalink)  
Старый 11.01.2023, 15:33
Аватар для webgraph
Профессор
Отправить личное сообщение для webgraph Посмотреть профиль Найти все сообщения от webgraph
 
Регистрация: 14.11.2014
Сообщений: 186

Сообщение от voraa Посмотреть сообщение
Дробные нельзя в BigInt
А если без точки, то не понятно, где целая, где дробная, и как их складывать и вычитать
В общем все числа были приведены к виду BigInt ) (примеры в шапке были отредактированы)
Ответить с цитированием
  #7 (permalink)  
Старый 11.01.2023, 15:44
Аватар для webgraph
Профессор
Отправить личное сообщение для webgraph Посмотреть профиль Найти все сообщения от webgraph
 
Регистрация: 14.11.2014
Сообщений: 186

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

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

'234.489274000000000' ->
234489274000000000

'234.489274' ->
234489274000000000

'23448.9274' ->
23448927400000000000

Т.е. в вашем случае было принято решение использовать 15 знаков после запятой — значит все числа в этой системе будут иметь 15 знаков после запятой. Это число знаков, очевидно, может быть выбрано только 1 раз.
Ответить с цитированием
  #8 (permalink)  
Старый 11.01.2023, 15:45
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,750

Сообщение от webgraph
Суть в том, что после точки количество знаков у всех одинаковое.
Т.е например 17 знаков на дробь и 17 знаков на целое
Итого строка длиной 34 знака.
И если целое меньше до дополняется нулями слева до 17 знаков, а дробная часть дополняется нулями справа до 17 знаков
Сообщение от voraa
Что должно получиться после приведения
'234.489274000000000'
'23448.9274'
?
Соответственно получаем строки
'0000000000000023448927400000000000'
и
'0000000000002344892740000000000000'

(Все равно не понятно, как их делить и умножать)
Ответить с цитированием
  #9 (permalink)  
Старый 11.01.2023, 15:49
Аватар для webgraph
Профессор
Отправить личное сообщение для webgraph Посмотреть профиль Найти все сообщения от webgraph
 
Регистрация: 14.11.2014
Сообщений: 186

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

(Все равно не понятно, как их делить и умножать)
А зачем нули перед целыми добавлять О_о Этого делать не нужно.

Ну в общем, уже же решили, что сейчас все числа просто имеют тип BigInt, так что с дробными числами можно успокоиться))
Ответить с цитированием
  #10 (permalink)  
Старый 11.01.2023, 15:54
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,750

Сообщение от webgraph
А зачем нули перед целыми добавлять О_о Этого делать не нужно.
Т.е если надо сравнить на больше-меньше - надо сначала перевести в bigint? Просто как строки не получится.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как изменять left и top у hover через js что бы иметь возможность провести шар по кон feddim72 Элементы интерфейса 2 13.12.2020 23:02
Как получить доступ к элементами внешнего svg файла? pokk Общие вопросы Javascript 1 06.12.2019 12:17
Как получиться доступ к элементам не своей страницы? AlkaLoiD Общие вопросы Javascript 4 29.11.2010 12:47
доступ к данным iframe gooody Events/DOM/Window 2 26.01.2010 17:37
dynatree.jquery - как получть доступ к родительскому узлу. ast-ross jQuery 0 23.03.2009 18:39