Size: a a a

2020 April 06

f

filin49 in pro.elixir
Suren Kirakosyan
А можно хранить json до 20МБ?
Имхо, если в бд пихается такой жсон, значит с архитектурой явно что то не то.
источник

SK

Suren Kirakosyan in pro.elixir
Но я вот что не понимаю, если ты обращаешься за файлом в БД, получаешь путь к нему, потом сервер идёт и находит этот файл и отправляет клинту, то это не такое же простое забивание канала, как и обращение сразу к БД за файлом/бинарником ?
источник

f

filin49 in pro.elixir
Suren Kirakosyan
Но я вот что не понимаю, если ты обращаешься за файлом в БД, получаешь путь к нему, потом сервер идёт и находит этот файл и отправляет клинту, то это не такое же простое забивание канала, как и обращение сразу к БД за файлом/бинарником ?
Нет.
источник

f

filin49 in pro.elixir
Не такое же
источник

SK

Suren Kirakosyan in pro.elixir
А что?
источник

S

Sabaverus in pro.elixir
Suren Kirakosyan
А можно хранить json до 20МБ?
Если тебе нужно хранить данные такого объема и много то используй самую простую древовидную структуру из md5 хеша имени файла
источник

S

Sabaverus in pro.elixir
А в БД можешь хранить только хеш
источник

SK

Suren Kirakosyan in pro.elixir
Ок, я просто не знаю как гуглиться это, могли помочь с нахождением ресурсов про это?
источник

S

Sabaverus in pro.elixir
Sabaverus
Если тебе нужно хранить данные такого объема и много то используй самую простую древовидную структуру из md5 хеша имени файла
первые 6 символов хеша первый уровень
следующие 7-12 символов - второй уровень вложенности
источник

S

Sabaverus in pro.elixir
и на второй уровень вложенности уже сохранять. Но нивкоем не сохранять все в одну папку
источник

S

Sabaverus in pro.elixir
Suren Kirakosyan
Ок, я просто не знаю как гуглиться это, могли помочь с нахождением ресурсов про это?
Например
название файла elixir.json
хеш имени 81e305e27948cca943d8aceb8e3fce06
итоговый путь /content/81e305/e27948/81e305e27948cca943d8aceb8e3fce06

В строке БД сохраняешь только хеш и оригинальное имя файла. Это самый простой способ хранения файлов. Вложенность может быть хоть на каждые два символа. А путь файла можно найти и из оригинального имени файла и из его хеша.
источник

SK

Suren Kirakosyan in pro.elixir
Ok. thank you very much
источник

LL

Lama Lover in pro.elixir
Suren Kirakosyan
Но я вот что не понимаю, если ты обращаешься за файлом в БД, получаешь путь к нему, потом сервер идёт и находит этот файл и отправляет клинту, то это не такое же простое забивание канала, как и обращение сразу к БД за файлом/бинарником ?
Во-первых, всё работает не в таком порядке: ты отдаёшь на клиент ссылку на файл, а клиент сам его у тебя потом запрашивает.
Во-вторых, клиент может закэшировать результат этого запроса тем самым сильно уменьшив нагрузку на сеть
В-третьих, реляционная база данных - это не просто место, куда кладётся вся информация приложения. Это программа, которая организует быстрый доступ к данным, оптимизирует хранилище, осуществляет поиск, кэширует запросы и так далее. Для того чтобы кэширование, поиск и оптимизации работали хорошо, нужно соответствовать требованиям базы по формату хранящихся в ней данных. Формат в данный момент таков - конечное количество столбцов фиксированной или ограниченной размерности, количество столбцов не часто изменяется. Доступ к данным по индексам. Чтение/запись = 80/20
источник

LL

Lama Lover in pro.elixir
Большие файлы приведут к тому, что придётся часто перестраивать дерево поиска (индекс), потому что если заменить один файл на другой, то появится либо много свободного места, либо места наоборот будет нехватать и все остальные записи (а в классических реляционных базах данные из одной записи лежат рядом) придётся двигать
источник

LL

Lama Lover in pro.elixir
Ещё агрумент - общая нагрузка на сеть. Просто посчитай количество сетевых соединений которые нужны для всего этого:
Вариант с базой
клиент <=> прокси (nginx) <=> приложение <=> база
Вариант со статикой на вебсервере
клиент <=> прокси (nginx)
источник

LL

Lama Lover in pro.elixir
А передача файла по TCP полностью забивает соединение в одну сторону
источник

LL

Lama Lover in pro.elixir
И при этом, файл будет храниться в оперативной памяти приложения
источник

LL

Lama Lover in pro.elixir
Если одна картинка 2мб в среднем, то 100 картинок (а это не очень большой рпс) в секунду будут занимать 200мб оперативки. Для дешевого сервера с 8гб оперативки это будет уже 2.5% от всей оперативной памяти
источник

LL

Lama Lover in pro.elixir
Я думаю, что теперь я тебя убедил
источник

SK

Suren Kirakosyan in pro.elixir
Не то слово.
Я тут только одно не понял. Ты говоришь, что соединение будет таким
клиент <=> прокси (nginx)
А как прокси понять, где этот файл, нужен же сам путь, который хранится в БД
источник