Добрый день. Возникла следующая проблема: В связи с больщим количеством активностей с одинаковыми прикрепленными файлами, размер БД растет очень быстро. Поэтому возникла идея хранить не сам файл, а ссылку на файл в некоей другой таблице.
Никто не реализовывал похожий функционал?
Добрый день, Илья!
Если я Вас правильно понял, то на деталь "Файлы и ссылки" и так можно добавлять просто ссылку.
Вы храните один файл где-то на сервере, а на деталь добавляете ссылку на него.
Андрей, немного не так.
Смысл в том что при добалении активности с файлом, происходит поиск такогоже файла из уже добавленных и при его нахождении добавлять ссылку на него а не файл, иначе добавлять файл.
Общая схема должна быть такой:
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.