Разделение таблицы для повышения производительности - PullRequest
1 голос
/ 11 января 2011

таблица моего пользователя в базе данных становится все больше (с точки зрения столбцов, а не строк) и, как следствие, замедляет различные области моего сайта.Это потому, что он пытается захватить каждый столбец из таблицы пользователя каждый раз, когда он выполняет с ним соединение.

Я подумал, что оставлю все общие поля в таблице пользователя, а затем добавлю дополнительные поля в отдельные таблицы.Например, скажем, у меня есть следующие таблицы в моей базе данных:

Users:

- UserID (PK, Identity)
- UserName
- Password
...

UsersActivity:

- UserID (PK, FK)
- LastActivityDate
- LastLoginDate
...

UsersPreferences:

- UserID (PK, FK)
- HtmlEmail
- HideEmail
...

Со следующими объектами:

public class User {
    public virtual int UserID { get; set; }
    public virtual string UserName { get; set; }
    public virtual string Password { get; set; }
    public virtual UserActivity Activity { get; set; }
    public virtual UserPreferences Preferences { get; set; }
}

public class UserActivity {
    public virtual User User { get; set; }
    public virtual DateTime LastActivityDate { get; set; }
    public virtual DateTime LastLoginDate { get; set; }
}

public class UserPreferences {
    public virtual User User { get; set; }
    public virtual bool HtmlEmail { get; set; }
    public virtual bool HideEmail { get; set; }
}

Мне просто интересно, как лучше всего отобразить это для оптимальногоспектакль?Я подумал, что могу сделать однозначное сопоставление свойств Activity и Performance в сущности User.Однако, насколько я понимаю, сопоставление «один к одному» не поддерживает отложенную загрузку, и этот подход в итоге оказался бы медленнее.

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

Прежде чем приступить к серьезному рефакторингу своего приложения, я подумал, что смогу узнать мнение кого-то, кто мог бы это сделать.Очень благодарен за помощь.

Спасибо

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

http://brunoreis.com/tech/fluent-nhibernate-hasone-how-implement-one-to-one-relationship/

Теперь проблема в том, что я получаю ошибку:

NHibernate.Id.IdentifierGenerationException: NHibernate.Id.IdentifierGenerationException: нулевой идентификатор, созданный для: UserActivity.

Ответы [ 2 ]

0 голосов
/ 11 января 2011

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

Тем не менее, есть много веских причин для использования легковесного объекта, поэтому вам может понадобиться реализовать для этого DTO (объект передачи данных).

0 голосов
/ 11 января 2011

В NHibernate 3.0 отношение один к одному поддерживает отложенную загрузку.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...