Преимущества индексирования в SQL Server 2008 - PullRequest
1 голос
/ 19 ноября 2009

Я работаю в социальной сети. Теперь наша команда решает хранить профиль пользователя в денормализованном виде. поэтому наша структура таблицы выглядит следующим образом

здесь атрибут означает одно поле для профиля пользователя, например, Имя, Фамилия, Дата рождения и т. Д. ...

и groups означает название группы полей, например Личные данные, академическая информация, достижения и т.д ..

**

Атрибут / Мастер групп - он создает иерархия групп и атрибутов.

**

Attribute_GroupId      bigint   
ParentId               bigint   
Attribute_GroupName    nvarchar(1000)   
ISAttribute            bit  
DisplayName            nvarchar(1000)   
DisplaySequence        int  

**

Атрибут управления информацией - магазины, которые контроль должен быть заполнен во время бега время для атрибута, а также его критерии проверки ...

**

Attribute_ControlInfoId     bigint  
AttributeId                 bigint  
ControlType                 nvarchar(1000)  
DataType                    nvarchar(1000)  
DefaultValue                nvarchar(1000)  
IsRequired                  bit 
RegulareExpression          nvarchar(1000)  

**

И, наконец, значения атрибутов, где для каждый атрибут, пользовательские значения будет храниться

**

AttributeId      bigint         Checked
IsValueOrRefId   bit            Checked
Value            nvarchar(MAX)  Checked
ReferenceDataId  bigint         Checked
UserId           bigint         Checked
                                Unchecked

Теперь они говорят, что мы создадим индекс для таблицы значений атрибутов. там нет и первичного ключа.

КАК в этой таблице будут храниться огромные данные. например если там будет 50 миллионов пользователей и 30 атрибутов, будет храниться 1500 миллионов записей. в этом случае, если мы создадим индекс для таблицы, оператор Insert и Update будет очень медленным, а также во время выборки данных для одного пользователя. Запросы также будут очень медленными.

Я подумал, что один вариант для этого, вместо значений атрибутов, я могу сохранить одну запись XML для одного пользователя.

Так что, пожалуйста, кто-нибудь может помочь мне найти лучший вариант для этого случая. как хранить данные?

здесь я не могу составить таблицу с жестким кодом, потому что администратор может добавлять новые поля в любое время, поэтому мне нужна некоторая структура данных, где я могу легко добавить любые поля в профиле пользователя всего за 1-2 шага.

пожалуйста, ответьте мне, если у кого-нибудь есть лучшее решение для этого.

Ответы [ 3 ]

4 голосов
/ 19 ноября 2009

Билл Карвин ( его блог ) соединил анти-шаблоны SQL PPT

Он предлагает 3 альтернативных решения EAV.

Индексация - это наименьшее из ваших беспокойств ...

4 голосов
/ 19 ноября 2009

Вам, ребята, нужен DBA!

Это одна из тех таблиц EAV, которая собирается укусить вас в будущем!

3 голосов
/ 19 ноября 2009

Ознакомьтесь с теми статьями, в которых подчеркивается, насколько плох этот выбор дизайна, и с какими потенциальными проблемами вы можете столкнуться, если будете придерживаться этого дизайна:

Кажется, это довольно распространенная проблема проектирования - и программистам кажется хорошей идеей решить ее таким образом с помощью таблицы атрибутов / значений - но на самом деле это не очень хорошая идея с точки зрения производительности базы данных.

Также:

Теперь они говорят, что мы создадим индекс в таблице значений атрибутов. там там также нет первичного ключа.

Как любят говорить некоторые гуру SQL: «Если у него нет первичного ключа, это не таблица».

Вам определенно нужно найти способ получить первичный ключ для ваших таблиц - если у вас нет ничего, что вы можете использовать как таковое, добавьте столбец «ID» типа «INT IDENTITY (1,1)» и поместите первичный ключ в этот столбец. Вам нужен первичный ключ! Разработка базы данных, первый урок, первые пять минут ....

Вам нужно переосмыслить свой дизайн и придумать что-нибудь более умное для хранения необходимых вам данных.

...