Добрый день.
Возникла следующая проблема: В связи с больщим количеством активностей с одинаковыми прикрепленными файлами, размер БД растет очень быстро. Поэтому возникла идея хранить не сам файл, а ссылку на файл в некоей другой таблице.
Никто не реализовывал похожий функционал?

Нравится

11 комментариев

Добрый день, Илья!
Если я Вас правильно понял, то на деталь "Файлы и ссылки" и так можно добавлять просто ссылку.
Вы храните один файл где-то на сервере, а на деталь добавляете ссылку на него.

Андрей, немного не так.
Смысл в том что при добалении активности с файлом, происходит поиск такогоже файла из уже добавленных и при его нахождении добавлять ссылку на него а не файл, иначе добавлять файл.
Общая схема должна быть такой:
TableFile (Id, data, md5)
ActivityFile (id, idFile, idActivity)

Илья,
в версии 5.2 все файлы хранятся в одной таблице [File], а в таблицах типа [ActivityFile] хранятся ссылки на [Id] файлов, так как Вы описали в комментарии.
Для реализации функционала проверки файлов на идентичность можно добавить в объект Файл поле, в котором будет его md5, а потом добавить проверку md5 при добавлении файла в Базовом объекте активности.
Вот общие рекомендации. На практике подобный функционал пока нереализовывался.

Андрей, именно так, но с одним уточнением:
В таблицу ActivityFile нельзя добавить более одной ссылки на файл т.к. ее струтура такова:

FileId (PK, FK, uniqueidentifier, not null)
ActivityId (FK, uniqueidentifier, not null)
CreatedByInvCRM (bit, not null)

Все попытки добавить поле Id в таблицу ActivityFile не увенчались успехом. Подскажите как изменить структуру таблицы на:
Id, FileId, ActivityId, CreatedByInvCRM

с сохранением работоспособности системы.

Илья, пробовали ли Вы добавлять колонку с помощью кода?
Например

alter table ActivityFile add Id  uniqueidentifier not null

Также в свойствах созданной колонки Id необходимо определить свойство "Default Value or Binding" "(newid())" (см. скриншот).

Далее необходимо снять PK c FileId и поставить его на Id. Это можно сделать так:

alter table ActivityFile drop CONSTRAINT PKWlV9xIyFFcIWdsORwBDTDdYBgE //здесь посмотрите, так ли у Вас называется constraint, но предварительно нужно скопировать его имя, понадобится дальше
 
alter table  ActivityFile add Primary Key (Id)
alter table  ActivityFile add Constraint PKWlV9xIyFFcIWdsORwBDTDdYBgE  Primary Key (Id)

Я протестировал, файлы добавляются и скачиваются без ошибок.

Андрей, спасибо. Получилось добавлять одинаковые файлы к активностям, но возникла проблема удаления файлов. Возникает ошибка: "Предупреждение
Выбранные элементы удалить невозможно, так как они используются в других объектах."

Здравствуйте, Илья. Дело в том, что файлы связаны с активностями по FileId, поэтому удалять файл нужно из всех активностей, с которыми он связан. Попробуйте удалить напрямую из базы данных, но это временное решение.
По идее, нужно организовать каскадное обновление, чтобы файлы удалялись без ошибок и сразу из всех активностей.

При уделаении напрямую из базы всё работает нормально, а можно чуть более подробно про каскадное удаление?

Илья, смысл каскадной связи в том, что при удалении или изменении записи, на которую есть ссылки, изменяются также и ссылающиеся на нее записи, что позволяет сохранить ссылочную целостность.
Вот статья на эту тему.
http://technet.microsoft.com/ru-ru/library/ms186973(v=sql.105).aspx

Попробуйте в таблице "ActivityFile" в свойствах внешнего ключа установить "Cascade" на события Delete и Update.

Спасибо. попробую

Андрей, спасибо всё заработало

Показать все комментарии