У меня есть таблица, содержащая пользовательский ввод, который необходимо оптимизировать.
У меня есть некоторые идеи о том, как решить эту проблему, но я был бы очень признателен за ваш вклад в это. Таблица, которая нуждается в оптимизации, называется структурой ниже.
Все таблицы, упомянутые ниже, имеют первичные целочисленные ключи, называемые Id.
Характеристики: Ms Sql Server 2008, Linq2Sql, веб-сайт asp.net, C #.
Текущая структура выглядит следующим образом:
Страница -> Поле -> FieldControl -> ValueGroup -> Значение
Страница
Страницы - это контейнер для одного или нескольких полей.
поле
Поле - это контейнер для одного или нескольких элементов FieldControl, таких как текстовое поле или параметры раскрывающегося списка.
Отношения: PageId
FieldControl
Если поле имеет тип TextBox, то для поля создается один элемент FieldControl.
Если поле имеет тип «DropDown», то для поля, содержащего текст параметра, создается один параметр FieldControl per dropdown.
Отношения: FieldId
ValueGroup
Каждый раз, когда пользователь заполняет поля на странице и сохраняет их, создается новая группа значений (Id), чтобы отслеживать вводимые пользователем данные, относящиеся к этому сохранению. Когда пользователь хочет
Посмотрите на ранее заполненную форму, группа значений используется для загрузки значений в FieldControls ранее заполненного экземпляра.
Отношения: нет
Значение
Фактический ввод FieldControl. Если пользователь введет «Hello» в TextBox, то «Hello» будет храниться в строке в этой таблице с последующей ссылкой, для которой FieldControl «Hello» был введен. ValueGroup связан со значениями, чтобы сгруппировать их, чтобы отслеживать, к какому сохранению / экземпляру они относятся, как описано в ValueGroup.
Отношения: ValueGroupId, FieldControlId
проблема
Если 100 000 страниц заполнены полностью, каждый из которых содержит 10 текстовых блоков, то мы получим 100 000 * 10 записей в таблице значений, что означает, что мы быстро достигнем миллиона записей, что делает его действительно медленным, как сейчас Пользователь может создать столько разных страниц с любым количеством полей, сколько ему нравится, и все эти значения сохраняются в таблице значений. Я использую эти данные, либо отображая сетку с пагинацией, которая отображает все записи для одного типа страницы, либо просматривая конкретный экземпляр страницы (значения, сгруппированные по ValueGroupId).
Некоторые идеи, которые у меня есть:
Хорошая индексация должна быть очень важна при оптимизации таблицы значений.
Должен ли я, возможно, добавить внешний ключ непосредственно обратно на страницу из значения, в результате чего будет выполнена индексация по (Id, PageId, ValueGroup), позволяющая сетке просмотра получать значения, которые относятся только к одной странице?
Должен ли я изучить разделение таблицы и, если да, как бы вы порекомендовали мне это сделать? Я думал, что разделение по Page, следовательно, получение кусков значений, которые имеют отношение только к определенной странице, было бы разумным в этом случае, верно? Как будет выглядеть сценарий / схема для чего-то подобного, где страницы могут быть созданы / удалены пользователями в любое время.
PS. На этом форуме должен быть значок для всех людей, которые закончили читать этот длинный пост, и я надеюсь, что я дал понять:)