Как лучше всего сохранять и извлекать двоичные файлы с помощью Oracle 10g?

StackOverflow https://stackoverflow.com/questions/62876

  •  09-06-2019
  •  | 
  •  

Вопрос

Я собираюсь реализовать в нашем приложении функцию, которая позволит пользователю «загружать» документ PDF или Microsoft PowerPoint, который приложение затем сделает доступным для других пользователей в средстве просмотра (чтобы им не удалось «загрузить» это в смысле «Сохранить как...»).

Я уже знаю, как сохранять и извлекать произвольную двоичную информацию в столбцах базы данных, но, поскольку это будет часто используемая функция нашего приложения, я боюсь, что это решение приведет к чрезвычайно большим таблицам базы данных (как мы знаем, один из наших клиентов захочет поместить видео в документах PowerPoint).

Я знаю, что в Oracle есть способ создать объект «каталог», но есть ли способ использовать эту функцию для хранения и извлечения двоичных файлов, сохраненных в другом месте на сервере базы данных?

Или я слишком параноик по поводу размера базы данных?

(для полноты нашего приложения — .Net WinForms, использующего Драйверы CoreLab/DevArt OraDirect.Net для Oracle 10g)

Это было полезно?

Решение

Пара вариантов:Вы можете поместить столбец BLOB в отдельное табличное пространство со своими характеристиками хранения;вы можете хранить BLOB-объекты в их собственной таблице, связанной с другой таблицей столбцом идентификатора.В любом случае, как вы предложили, вы можете определить столбец как BFILE, что означает, что фактический файл хранится вне базы данных в каталоге.Что может вызвать беспокойство, так это то, что LOB BFILE не участвуют в транзакциях и не могут быть восстановлены с помощью остальной части базы данных.

Все это обсуждается в справочнике по Oracle 10gR2 SQL, глава 2, начиная со стр. 23.

Другие советы

Я думаю, это зависит от того, что вы считаете чрезвычайно большим.

Это действительно зависит от варианта использования.Если к документам обращаются редко, то можно поместить их в базу данных (с преимуществом получения «бесплатных» резервных копий, например, вместе с базой данных).

Если это файлы, к которым будут обращаться снова и снова, возможно, вам лучше поместить их непосредственно на диск и просто сохранить местоположение или даже (если у него действительно высокая пропускная способность) поискать что-то вроде МогилеФС

Никто не сможет дать вам ответ «да» или «нет».

Вы можете использовать обычный тип столбца LOB и установить параметры хранения для этого поля, чтобы оно находилось в отдельном табличном пространстве.Создайте табличное пространство где-нибудь, способное обрабатывать огромные объемы данных, и вы сведете к минимуму влияние.

Чтобы быть серьезно параноиком в отношении использования диска, вы можете дополнительно сжать табличное пространство, пометив его как таковое.Что-то вроде:

Создать табличное пространство binary_data1 datafile some_san_location по умолчанию сжатие хранения (...)

По моему опыту, простое поле VARCHAR2, содержащее имя файла вложений, является лучшим и простым решением.Размером файловой системы управлять намного проще, чем размером базы данных.

Данные должны где-то жить, будь то внутри БД или вы просто храните ссылку на доступный (сервер) путь к файлу, вы все равно жуете пространство.

Раньше я просто использовал простые LOB-поля, казалось, все работало нормально.Если вы храните данные внутри БД, по крайней мере, вы минимизируете проблемы с резервным копированием - у вас может быть много данных для резервного копирования, но когда вы их восстановите, все они будут там.Разделение двоичного файла означает, что вы можете повредить БД или потерять данные, если не будете осторожны с тем, что создаете резервную копию.

Одна из причин просто сохранить ссылку или идентификатор, который можно использовать для создания ссылки, заключается в том, что хранилище, которое вы обычно используете для БД Oracle, довольно дорогое.Если у вас много больших файлов, обычно гораздо выгоднее разместить их на менее дорогом массиве дисков.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top