|
Как лучше хранить данные в БД
|
|||
---|---|---|---|
#18+
Гаджимурадов Рустам, Да, FIBPlus Но ввиду безвременной кончины оного задумываюсь о переходе на FireDAC Тут многие говорят - хранить отдельно, в файлах. Можете в нескольких словах описать принцип. Хочется так чтобы у простого пользователя не было доступа к хранилищу. Понятно что если хранить файлы на диске, значит в БД хранится ссылка на файл. Но подскажите как можно лучше всего структурировать хранилище. Условия возьмем те же (чуть-чуть изменив): 75тыс. клиентов, 3 обращения по 5 сканов Просто я пока ума не приложу как лучше. Создавать по отдельной папке на клиента - 75тыс. папок. не будут ли операции с файлами подвисать при входе в эту папку. Если нет - то тогда решение есть: 1. На каждого клиента по папке по его уникальному номеру 2. Внутри папки по обращениям 3. в папке обращения сканы. Осталось только понять как сохранять картинки так чтобы пользователь не имел доступа к папке хранилища. Распределение доступа, увы не предлагать, т.к. у многих клиентов БД сеть настроена без домена. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2018, 08:54 |
|
Как лучше хранить данные в БД
|
|||
---|---|---|---|
#18+
fraksКонечно, тем кто начинает разрабатывать систему где потенциально может быть много файлов - лучше заранее продумать ситуацию с многими файлами. Вспоминаются грабли когда я "сэкономил" и под ID справочника контрагентов отвел smallint. И под справочник авторов отвел диапазон в 10000 кодов. И то и другое довольно быстро уперлось в потолок. Я обычно BigInt под ID отвожу, если нет других требований. ИМХО не то место, где имеет смысл экономить. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2018, 10:04 |
|
Как лучше хранить данные в БД
|
|||
---|---|---|---|
#18+
akrushПросто я пока ума не приложу как лучше. Создавать по отдельной папке на клиента - 75тыс. папок. не будут ли операции с файлами подвисать при входе в эту папку. Если нет - то тогда решение есть: 1. На каждого клиента по папке по его уникальному номеру 2. Внутри папки по обращениям 3. в папке обращения сканы. Тут выше уже приводили, на мой взгляд, удобное решение с хранением файлов по ID и разделение на папки по классам. akrushОсталось только понять как сохранять картинки так чтобы пользователь не имел доступа к папке хранилища. Распределение доступа, увы не предлагать, т.к. у многих клиентов БД сеть настроена без домена.Ну в моём случае трёхзвенка будет, так что с точки зрения клиента - без разницы как будут хранится документы. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2018, 10:07 |
|
Как лучше хранить данные в БД
|
|||
---|---|---|---|
#18+
Basil A. SidorovВзяли монотонно растущий идентификатор из базы, преобразовали в строку, дополнили ведущими нулями до девяти цифр, взяли две первые группы по три цифры и получили чёткую балансировку по каталогам и предельно однозначную идентификацию местонахождения файла. Совершенно несложным способом эта схема расширяется на вариант "у нас много точек хранения", если (когда) вам потребуется разнести хранилище по нескольким физическим томам.Это хороший пример. Но ничто не мешает таким же способом хранить блобы в нескольких внешних БД. Их можно независимо бекапить. Их можно раскидать по разным серверам, при необходимости. Так что... нет единого решения для всех. И это хорошо :) ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2018, 10:19 |
|
Как лучше хранить данные в БД
|
|||
---|---|---|---|
#18+
RiniumДелаю бэкап базы, затем или одновременно делаю бэкап папки при этом пользователь удаляет/добавляет/меняет данные и файлы в бэкап папки могут не попасть те файлы которые удалились и попадут которые добавилисьУдаление должно быть логическим, с отдельной процедурой очистки, которая исполняется вместе с регламентными процедурами. Изменений быть не должно: логическое удаление и создание нового файла. Таким образом, если в хранилище добавляется новый файл, то он получает новый идентификатор. Логика использования этого идентификатора в базе - отдельная тема, которая никак не связана с организацией файлового хранилища. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2018, 11:36 |
|
Как лучше хранить данные в БД
|
|||
---|---|---|---|
#18+
akrushСимонов Денисakrush, если для хранения сканов хочется разместить их в отдельную БД, то возникает логический вопрос, а на хрена тогда вообще БД, проще в расшаренной папке хранить. Есть несколько причин: 1. При каждом обращении человек подает новое заявление и справки. Если хранить в папке - пользователя практически не реально заставить хранить информацию или в структуре или правильно называя файл. 2. Нет прямого доступа к персональным данным на сканах. Понятно что опытный пользователь откроет БД и посмотрит, но таких на 220 коиентов 1-3% 3. При 50тыс. заявителях - это либо дополнительно 50тыс. папок по номерам заявлений и внутри папки по номерам подачи разных заявлений, либо вообще все в одной папке. А это, даже при 5 обращениях+3 документа, 50000*5*3=750 000 файлов/папок. Не думаю что операционка себя будет комфортно чувствовать. Да и поиск в таком количестве усложняется, даже программный поиск. Готов выслушать (прочитать) возражения. :) а чего это юзеры столько всего решают, а не вы? и название файлам таки можно же дать самому, а юзерам алиас отдавать Basil A. SidorovИ, по опыту всё той же позапрошлой работы, могу сказать, что первый вариантом был как раз "блобы в базе". Сдохло, ибо: 1. Требуется больше места, чем на диске; 2. Сильно дороже по ресурсам. Вторым вариантом был "свалим все файлы в одном каталоге". Сдохло ибо сканирование ~65000 файлов в одном каталоге - (сравнительно) очень медленно. Третьим вариантом было хранение в иерархии каталогов. Вполне нормально, хотя реализация была далеко не идеальной. о5 25 ( если вы сложите всё в одну папку, ОНО УМРЁТ. Потому что МУХ всё содержимое каталога СКАНИРУЕТ каждый раз, когда туда идёт запрос. Поэтому не кладите 50000 файлов в один каталог , это я вам как админ говорю. Каталоги != таблицы, в них нельзя хранить триллионы строк! А вот если вы сложите свои файлы так: /in/di/vi/individual.php то у вас всё будет летать даже при миллионах файлов, ибо каждый слот даёт 26 букв + 10 цифр, итого 36 ** 6 = 2176782336 (кол-во дир, НЕ файлов! В каждой штук по 500 файлов себя вполне нормально чувствовать будут) главное цифрами названия не делать, а то из-за ограничения int там на 1-2 будет сильно больше, чем на остальных alekcvpВсе эти данные требуется хранить в одной таблице, и тут возник вопрос: как оптимальнее их туда складывать - напрямую данные в BLOB поля таблицы или в таблице хранить только все остальные параметры и имя файла, а сами файлы - в отдельной папке/папках на диске? Как будет правильнее с точки зрения производительности базы данных? Повлияет ли большая таблица с BLOBами на скорость работы всей базы в целом или только на эту таблицу? P.S: Доступ к этим записям (и файлам) в 99% времени будет только на чтение. ну вот пару мыслей на этот счёт: авторfacebook оптимизировали свой сервис после возросшей нагрузки: Кеширование более часто используемых миниатюр изображений в памяти на оригинальных серверах для масштабируемости, надежности и производительности Распределение их по CDN для уменьшения сетевых задержек Возможно сделать еще лучше: Хранение изображений в больших бинарных файлах (blob) Сервис, отвечающий за фотографии имеет информацию о том, в каком файле и с каким отступом от начала расположена каждая фотография (по ее идентификатору) Этот сервис в Facebook называется Haystack и он оказался в 10 раз эффективнее «простого» подхода и в 3 раза эффективнее «оптимизированного» и: ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2018, 11:50 |
|
Как лучше хранить данные в БД
|
|||
---|---|---|---|
#18+
alekcvpakrushПросто я пока ума не приложу как лучше. Создавать по отдельной папке на клиента - 75тыс. папок. не будут ли операции с файлами подвисать при входе в эту папку. Если нет - то тогда решение есть: 1. На каждого клиента по папке по его уникальному номеру 2. Внутри папки по обращениям 3. в папке обращения сканы. Тут выше уже приводили, на мой взгляд, удобное решение с хранением файлов по ID и разделение на папки по классам. нельзя их по ID хранить, потому что из-за ограничения на int, файлов с 1-2 в начале будет сильно больше (~5 раз), чем всех остальных ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2018, 11:52 |
|
Как лучше хранить данные в БД
|
|||
---|---|---|---|
#18+
tip78нельзя их по ID хранить, потому что из-за ограничения на int, файлов с 1-2 в начале будет сильно больше (~5 раз), чем всех остальныхКто сказал, что нужно распределять файлы по папкам "в лоб" ? Простейший способ - рассматривать двоичное представление ID, начиная с младших бит (а не со старших) ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2018, 12:00 |
|
Как лучше хранить данные в БД
|
|||
---|---|---|---|
#18+
tip78МУХ всё содержимое каталога СКАНИРУЕТ каждый раз Это в FAT/FAT32 где директории - простой несортированный массив В других системах это деревья http://spider.seds.org/spider/OS2/HPFS/dirs.html http://ext2.sourceforge.net/2005-ols/paper-html/node3.html ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2018, 12:16 |
|
Как лучше хранить данные в БД
|
|||
---|---|---|---|
#18+
tip78файлов с 1-2 в начале будет сильно больше (~5 раз), чем всех остальных content-addressed storage обычно на хэшах делается а хэши распределяются равномерно ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2018, 12:18 |
|
Как лучше хранить данные в БД
|
|||
---|---|---|---|
#18+
Ariochtip78МУХ всё содержимое каталога СКАНИРУЕТ каждый раз Это в FAT/FAT32 где директории - простой несортированный массив В других системах это деревья http://spider.seds.org/spider/OS2/HPFS/dirs.html http://ext2.sourceforge.net/2005-ols/paper-html/node3.html да хоть кусты, суть не в названии, а в ресурсах. На линухе это всё так же прекрасно виснет и падает. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2018, 12:58 |
|
Как лучше хранить данные в БД
|
|||
---|---|---|---|
#18+
Эта... Надо бы отличать запросы на открытие одного конкретного файла и на сканирование списка файлов... Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2018, 13:05 |
|
Как лучше хранить данные в БД
|
|||
---|---|---|---|
#18+
tip78нельзя их по ID хранить, потому что из-за ограничения на int, файлов с 1-2 в начале будет сильно больше (~5 раз), чем всех остальныхВы, мопвашуять, когда думать научитесь??? Когда число преобразуется в строку, строку эту надо дополнять ведущими нулями до заданной длины. У п(р)ограммиста такие вещи вообще должны быть на уровне условного рефлекса. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2018, 13:25 |
|
Как лучше хранить данные в БД
|
|||
---|---|---|---|
#18+
Basil A. Sidorov, ну будет у него в начале нулей больше, чем единиц он же не про это, а про равномерность распределения "элементов" по "корзинам" если он будет как в примере рубить по две буквы А вот если вы сложите свои файлы так: /in/di/vi/individual.php то тогда миллионы файлов "00000000.txt" .... "00999999.txt" все лягут в корзину 00/* и никто не ляжет в 01/, 02/ и т.д. tip78На линухе это всё так же прекрасно виснет и падает. Вот реально смотря что и как и с чем делается. Тот же третий ReiserFS был известен именно оптимизацией для работы с директориями, в которых много мелких файлов. Для сборки программ из исходников например. Конечно, если обращение к конкретному файлу по заранее известному пути и имени делается полным перебором всех файлов на диске - тогда все ляжет конечно. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2018, 13:32 |
|
Как лучше хранить данные в БД
|
|||
---|---|---|---|
#18+
AriochВ других системах это деревьяПоскольку, как я уже отмечал, второй вариант файлового хранилища реальной системы был "все файлы в один каталог", то могу совершенно определённо заявить, что даже 65000 файлов в каталоге NTFS-диска - "байтораздирающее зрелище". В целом, оно, конечно, и не такое сдюжит, но делать так не надо. P.S. "Специально подготовленный" SP1 для Windows 7 x64 - 100738 файлов и 16004 каталога (не считая вложенны). Открывается такой каталог около пяти секунд в 64-разрядном TotalComander-е. "Могу обоснованно предположить", что при конкурентном доступе всё станет сильно грустнее. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2018, 13:33 |
|
Как лучше хранить данные в БД
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovЭта... Надо бы отличать запросы на открытие одного конкретного файла и на сканирование списка файлов... на некоторых ФС - проще всего вспомнить FAT - разницы реально нет. Потому что там записи о файлах лежат несортированным списком. Если заранее в памяти метаинформация этого файла не закэширована - то файловая система будет o(n/2) вычитывать всё содержимое директории, пока не наткнётся. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2018, 13:35 |
|
Как лучше хранить данные в БД
|
|||
---|---|---|---|
#18+
Basil A. SidorovОткрывается такой каталог около пяти секунд в 64-разрядном TotalComander-е. Здраствуйте, я ваша тётя. В данном случае происходит 1) чтение информации ОБО ВСЕХ файлах в каталоге 2) загрузка дополнительной информации о КАЖДОМ файле из сторонних источников - files.bbs, descript.ion, COM Shell Extensions, WDX-плагины 3) загрузка всей этой фигни в Windows Common Controls ListView И где-то внутри этого нетривиального процесса всё тормозит. Если уж реально хочется протестировать, сделай одну папку на 100738 файлов. Отдельно сделай список на 100 или тысячу названий файлов. И сделай скрипт/программу, которая по этому списку (и только по нему) будет открывать файлы (а не каталоги!!!) и читать из каждого первый килобайт. Перезагрузи компьютер (чтобы сбросить кэш диска в ОЗУ) и запусти. PS. кстати, NTFS насколько помню по интеллектуальности метода хранения файловых записей в общем-то от HPFS вернулась на полшага назад к FAT. Так что, возможно, это не лучший пример. Но уверять не буду, давно читал и только праздного интереса ради. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2018, 13:42 |
|
Как лучше хранить данные в БД
|
|||
---|---|---|---|
#18+
Arioch1) чтение информации ОБО ВСЕХ файлах в каталоге 2) загрузка дополнительной информации о КАЖДОМ файле из сторонних источников - files.bbs, descript.ion, COM Shell Extensions, WDX-плагины 3) загрузка всей этой фигни в Windows Common Controls ListView 4) для файлов ещё и иконки считываются грузятся, либо из самого файла, либо из другого, ассоциированного через реестр. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2018, 13:43 |
|
Как лучше хранить данные в БД
|
|||
---|---|---|---|
#18+
Ariochну будет у него в начале нулей больше, чем единицВы когда научитесь целиком читать??? Минимально разумный уровень вложения - два каталога от базового. В этом случае миллиард файлов распределятся по иерархии, где в каждом каталоге будет не более тысячи объектов . Просто в каждом каталоге верхнего уровня будет не более тысячи (вложенных) каталогов , а в каждом каталоге второго уровня - не более тысячи файлов . Схема, блин, незатейливая как редис и простая как грабли, но, блин, мы всё равно найдём ветряных мельниц, с которыми можно побороться. P.S. Можно конвертировать число в шестнадцатиричную строку, тогда всё теже девять символов позволят сохранять до 65 миллиардов файлов. Можно для каждого файла сохранить расширение, если хочется. Просто для того, чтобы быстро понимать где архив, где pdf, а где - doc какой-бынить. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2018, 13:43 |
|
Как лучше хранить данные в БД
|
|||
---|---|---|---|
#18+
Напоминаю исходный тезис. Откуда вообще разговор про "нули" вылез. Basil A. Sidorovнельзя их по ID хранить, потому что из-за ограничения на int, файлов с 1-2 в начале будет сильно больше (~5 раз), чем всех остальныхВы, мопвашуять, когда думать научитесь??? Когда число преобразуется в строку, строку эту надо дополнять ведущими нулями до заданной длины. дополнение нулями было предложено (и мною обсуждалось) как лекарство от заявленного перекоса "файлов с 1-2 в начале будет сильно больше" и только в этом контексте не про тысячи и миллиарды, а только и исключительно про равномерное или неравномерное распределение всё ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2018, 13:47 |
|
Как лучше хранить данные в БД
|
|||
---|---|---|---|
#18+
Ariochне про тысячи и миллиарды, а только и исключительно про равномерное или неравномерное распределениеОбъясните, каким образом в предложенной мною схеме может возникнуть значимая неравномерность? Если, конечно, исключить патологический случай, когда мы случайным образом теряем девяносто процентов идентификаторов монотонной последовательности. P.S. Пофигу общее количество файлов - для балансировки существенно, чтобы ни в одном каталоге не было "слишком много объектов". Предельное количество файлов определяет лишь глубину дерева хранения. Два, максимум, три уровня закрывают любые потребности, включая самые запредельные. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2018, 13:54 |
|
Как лучше хранить данные в БД
|
|||
---|---|---|---|
#18+
Basil A. Sidorov, оттуда же, откуда у tip78 в 21354526 ВК - верхнего уровня корзина tip78 B.A.S. ВК по tip78 ВК по B.A.S.1.txt 00000001.txt 1 002.txt 00000002.txt 2 003.txt 00000003.txt 3 004.txt 00000004.txt 4 005.txt 00000005.txt 5 00.....11.txt 00000011.txt 1 0012.txt 00000012.txt 1 0013.txt 00000013.txt 1 0014.txt 00000014.txt 1 0015.txt 00000015.txt 1 00..... Будет ли неравномерность проблемой или нет - вопрос отдельный. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2018, 14:11 |
|
Как лучше хранить данные в БД
|
|||
---|---|---|---|
#18+
Basil A. SidorovОбъясните, каким образом в предложенной мною схеме может возникнуть значимая неравномерность? Если, конечно, исключить патологический случай, когда мы случайным образом теряем девяносто процентов идентификаторов монотонной последовательности. ну в hex int = 7FFFFFFF т.е половина (8-F) будет в меньшинстве ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2018, 14:13 |
|
Как лучше хранить данные в БД
|
|||
---|---|---|---|
#18+
AriochBasil A. Sidorov, оттуда же, откуда у tip78 в 21354526 ВК - верхнего уровня корзина tip78 B.A.S. ВК по tip78 ВК по B.A.S.1.txt 00000001.txt 1 002.txt 00000002.txt 2 003.txt 00000003.txt 3 004.txt 00000004.txt 4 005.txt 00000005.txt 5 00.....11.txt 00000011.txt 1 0012.txt 00000012.txt 1 0013.txt 00000013.txt 1 0014.txt 00000014.txt 1 0015.txt 00000015.txt 1 00..... Будет ли неравномерность проблемой или нет - вопрос отдельный. эта тема с каталогами не для файлов 1.txt, а 127627334.txt ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2018, 14:16 |
|
|
start [/forum/topic.php?fid=40&msg=39633746&tid=1561107]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
56ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
59ms |
get tp. blocked users: |
1ms |
others: | 317ms |
total: | 480ms |
0 / 0 |