У меня есть большой стол сервера SQL, который выглядит примерно так:Работа с дублированием данных в SQL Server
ImageId int Page int FSPath varchar(256) ImageFrame int ...
В таблице хранятся записи для каждой страницы нескольких файлов изображений. Это делается для того, чтобы таблица отображала изображения, где каждая страница представлена другим файлом, и многостраничные файлы изображений, содержащие страницы в одном файле. Когда я имею дело с многостраничной настройкой, значение столбца FSPath точно дублируется для каждой страницы в пределах того же документа, который ест много места (только эта таблица в настоящее время составляет ~ 5 ГБ). Кажется очень расточительным дублирование данных таким образом, но я не смог найти альтернативное решение, которым я доволен.
В шаблоне использования для этой таблицы преобладают поисковые запросы на основе первичного ключа (ImageId/Page) для пути (и других столбцов), но мне также необходимо иметь возможность эффективно обрабатывать вставку новых данных и случайное удаление.
Если я создаю таблицу поиска для элементов пути и вставляю идентификатор элемента пути в таблицу страниц, мне нужно будет индексировать его как по идентификатору, так и по пути, что может повредить сценарий, в котором существует отдельный путь для каждой страницы и усложняет вставку новых данных, где путь может или не может существовать в таблице поиска. Кроме того, удаление любой строки в таблице основных страниц потребует, чтобы я очистил связанную запись пути, если она больше не используется.
Я надеялся, что смогу создать обновляемый вид объединенных таблиц и позволить SQL Server сделать для меня магию, но я получаю сообщение: View или function 'Scrap.dbo.PageView' не является обновляемым, поскольку модификация влияет на несколько базовых таблиц. Попытка выполнить вставку.
Есть ли разумный способ сделать это, что я просто отсутствую, или мне не повезло?
У меня возникают проблемы с производительностью из-за пейджинга на диске, который возникает, когда я загружаю эти записи. Я исследовал подход с фиксированной шириной, но учитывая, что моя средняя длина пути составляет 25 символов, переключение на char (256) будет почти 10-кратным моим требованиям к хранению и вызовет больше ошибок диска. – 2009-04-03 17:09:19