2009-10-02 2 views
0

Как способ узнать NHibernate, я придумал небольшой проект, который включает типичную систему аутентификации пользователей &. Это заставило меня задуматься о том, как это будет сделано. Я быстро собрал следующие классы и сопоставил их с базой данных, которая работала после большого количества проб и ошибок. Я закончил с схемой базы данных из трех таблиц со многими и многими таблицами ассоциаций между таблицами User и Group.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

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

+1

Я думал, что одной из особенностей убийцы ORM было незнание персистентности. Если бы я должен был создать метод GetUsers (...) в классе Group, ему нужно было бы знать, как получить пользователей, что, безусловно, является постоянством. Аналогично, если я хотел вызвать myGroup.AddUser (...), если мой класс группы не поддерживает коллекцию пользователей, где она помещает пользователя? – 2009-10-02 18:55:50

1

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

Смежные вопросы