NHibernate и большие коллекции - PullRequest
0 голосов
/ 02 октября 2009

Как способ изучения NHibernate, я придумал небольшой проект, который включает типичную систему аутентификации пользователей и групп. Это заставило меня задуматься о том, как это будет сделано. Я быстро соединил следующие классы и сопоставил их с базой данных, которая работала после многих проб и ошибок. Я получил схему базы данных из трех таблиц с таблицей связи «многие ко многим» между таблицами «Пользователь» и «Группа».

public class User
{
    public virtual string Username { get; set; }
    public virtual byte[] PasswordHash { get; set; }
    public virtual IList<Group> Groups { get; set; }
}

public class Group
{
    public virtual string Name { get; set; }
    public virtual IList<User> Users { get; set; }
}

Мой вопрос касается масштабируемости и потенциальной производительности такого класса дизайна. Если бы это было в производственной системе с десятками тысяч пользователей, даже с ленивой загрузкой в ​​коллекцию пользователей группы, любой вызов свойства Groups мог бы вызвать потенциально ОГРОМНЫЙ поиск данных.

Как бы NHibernate справился с таким сценарием и как я мог бы улучшить свой дизайн?

Ответы [ 2 ]

2 голосов
/ 02 октября 2009

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

1 голос
/ 28 апреля 2011

Я знаю, что этот вопрос старый, но случайно наткнулся на него. Вы утверждаете, что «даже при отложенной загрузке в коллекцию« Пользователи группы »любой вызов свойства Groups может вызвать потенциально ОГРОМНЫЙ поиск данных». Зачем? Предположительно, число групп не составляет десятки тысяч, и при доступе к свойству Groups для пользователя будет загружена только коллекция Groups, а не коллекция Users в коллекции Groups (если только пользователи не отмечены как lazy-load). Извлечение огромных данных произойдет только в том случае, если вы получите доступ к коллекции «Пользователи» в группе, и в этом случае я бы порекомендовал не делать эту связь доступной из сопоставления группы.

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