Я создаю веб-сайт в ASP.NET MVC и использую NHibernate как ORM. У меня есть следующие таблицы в моей базе данных:Будет ли запрос NHibernate влиять на производительность?
- Закладки
- TagsBookmarks (узловая таблица)
- Метки
Mapping:
public BookmarkMap()
{
Table("Bookmarks");
Id(x => x.Id).Column("Id").GeneratedBy.Identity();
Map(x => x.Title);
Map(x => x.Link);
Map(x => x.DateCreated);
Map(x => x.DateModified);
References(x => x.User, "UserId");
HasManyToMany(x => x.Tags).AsSet().Cascade.None().Table("TagsBookmarks").ParentKeyColumn("BookmarkId")
.ChildKeyColumn("TagId");
}
public TagMap()
{
Table("Tags");
Id(x => x.Id).Column("Id").GeneratedBy.Identity();
Map(x => x.Title);
Map(x => x.Description);
Map(x => x.DateCreated);
Map(x => x.DateModified);
References(x => x.User, "UserId");
HasManyToMany(x => x.Bookmarks).AsSet().Cascade.None().Inverse().Table("TagsBookmarks").ParentKeyColumn("TagId")
.ChildKeyColumn("BookmarkId");
}
Мне нужна данные из Bookmar ks и таблицы тегов. Более конкретно: мне нужно 20 закладок со связанными тегами. Первое, что я делаю, - выбрать 20 идентификаторов закладок из таблицы Закладок. Я делаю это, потому что пейджинг не работает хорошо на декартовом продукте, который я получаю во втором запросе.
Первый запрос:
IEnumerable<int> bookmarkIds = (from b in SessionFactory.GetCurrentSession().Query<Bookmark>()
where b.User.Username == username
orderby b.DateCreated descending
select b.Id).Skip((page - 1) * pageSize).Take(pageSize).ToList<int>();
После этого я выбираю закладки для этих идентификаторов.
Второй запрос:
IEnumerable<Bookmark> bookmarks = (from b in SessionFactory.GetCurrentSession().Query<Bookmark>().Fetch(t => t.Tags)
where b.User.Username == username && bookmarkIds.Contains(b.Id)
orderby b.DateCreated descending
select b);
Причина я использую выборку, потому что я хочу, чтобы избежать N + 1 запросов. Это работает, но приводит к декартовому продукту. Я читал в некоторых сообщениях, что вам следует избегать декартовых продуктов, но я действительно не знаю, как это сделать в моем случае.
Я также кое-что прочитал о настройке размера партии для запросов N + 1. Это действительно быстрее, чем этот единственный запрос?
Пользователь может добавить max 5 тегов к закладке. Я выбираю 20 закладок на страницу, поэтому наихудший сценарий для этого второго запроса: 5 * 20 = 100 строк.
Будет ли это влиять на производительность, когда у меня есть много данных в таблицах Закладки и Тэги? Должен ли я делать это по-другому?
Каков конечный результат, которого вы пытаетесь достичь? – Fran
Страница с закладками и связанными с ними тегами. Добавлен вопрос. –