Варианты хранения настроек

1. Одна таблица с множеством колонок
Подходит для настроек, которые есть у всех пользователей в обязательном порядке (например, логин, пароль, почта).
В остальных случаях этот вариант плохой.
2. Таблицы: Пользователи, Настройки, Настройки_Пользователей. Последняя таблица включает в себя ссылки на две первые и поле Значение для настройки.
Плохо тем, что для миллиона пользователей с 50-ю настройками будет 50 миллионов записей в таблице.
3. Предыдущий вариант, только таблицы разделять по тематике. Тогда на миллион пользователей будет всего десять миллионов записей.
Эти варианты можно оптимизировать заданием настроек по умолчанию. Если записи о настройке в базе нет, применяется настройка по умолчанию. Таким образом, количество записей можно сократить.
4. Сериализация. Количество колонок/записей сокращается, но внутренняя структура становится менее прозрачной и более трудной для обработки и сортировки.
5. XML. Хранение пользовательских настроек в XML, с использованем значений по умолчанию.

Ну и наконец, самый лучший вариант — смешанный.

«Жесткие» настройки хранить в одной таблице, на каждую настройку по колонке (Аккаунт)
Разделить настройки тематически (сейчас выделены Приватность и Уведомления)
Использовать настройки по умолчанию
Использовать XML для тех настроек (вместо сериализации — имхо, лучше использовать существующие и проверенные технологии, чем городить свои), по которым не нужно выбирать списки (медленная пакетная обработка для статистики не в счет)
Записывать настройки в сессии

По каким настройкам выборки списков (напр., права доступа к альбуке), а что отн. только к конкретному пользователю

Оптимизация LINQ-запроса

var sw = Stopwatch.StartNew();
      for (int i = 0; i  new { Id = c.Id, UploadedDate = c.UploadedDate })
          .Where(c => c.UploadedDate > this.monthAgo)
          .ToArray()
          .GroupBy(c => c.UploadedDate.Date)
          .Select(c => new { Date = c.Key, Count = c.Count() })
          .OrderByDescending(c => c.Date)
          .ToDictionary(c => c.Date, c => c.Count);  
      }
      
      sw.Stop();
      System.Diagnostics.Trace.WriteLine("SW1: " + sw.ElapsedMilliseconds.ToString());
      
      sw.Restart();
      for (int i = 0; i  c.UploadedDate > this.monthAgo)
          .ToArray()
          .GroupBy(c => c.UploadedDate.Date)
          .OrderByDescending(c => c.Key.Date)
          .ToDictionary(c => c.Key, c => c);  
      }
      sw.Stop();
      System.Diagnostics.Trace.WriteLine("SW2: " + sw.ElapsedMilliseconds.ToString());

Пример структуры сайта на ASP.Net

Базовый сервис

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Example.Data.Services
{
    public abstract class BaseService : IDisposable
    {
        protected ExampleContext context;

        protected BaseService()
        {
            context = new ExampleContext();
        }

        public void Dispose()
        {
            context.Dispose();
        }
    }
}

Continue Reading →

Мегафункция для тегов

Задача: в базе хранятся теги и теги к контенту (связь тег-контент).
Пользователь вводит свои теги (String[] tagTitles) к контенту.
Среди введенных пользователем тегов могут быть как совсем новые, так и уже существующие в базе.
Новые теги необходимо добавить в таблицу тегов и в таблицу связи тег-контент.
У уже существующих тегов необходимо увеличить поле количества использований на 1.
Continue Reading →

Почему я не люблю AJAX-автоподгрузку

https://habrahabr.ru/post/140781/

Почему я не люблю AJAX-автоподгрузку и предпочитаю ссылки с номерами страниц

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

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

Я не люблю автоподгрузку новых элементов на страницу потому что:

1) Она не даёт понимания о количестве страниц сайта.
Примитивная манипуляция, чтобы человек смотрел и смотрел, не зная сколько ему ещё предстоит потратить на это времени. Как только ты досмотрел страницу и готов заняться другим делом, псевдодружелюбный сайт подгружает новую страницу.

Без автоподгрузки я всегда знаю сколько страниц я просмотрел, сколько хочу просмотреть и сколько их всего, а тут меня держат за осла перед которым привязана морковка. Передо мной неизвестность. Она создаёт ощущение, что просматривание этого сайта никогда не кончится. А я не настолько люблю сайты, чтобы смотреть их сутками. Даже социальные сети.

2) Нет никакой гарантии, что ссылки и новости доступные через автоподгрузку проиндексируются в поисковиках. Допустим на странице показывается 10 последних элементов, в перерыв между заходами робота было опубликовано ещё 20, робот увидит только последние 10 и предпоследние 10 не проиндексируются. Если ваш сайт не твиттер и не имеет специального договора с гуглом, то рассчитывать на 100%-ю индексацию не стоит. Некоторое увеличение шансов индексации даёт наличие RSS.

Применительно к сайту-примеру мы имеем проиндексированными 170 страниц из более чем 240, что составляет менее 71% страниц.

3) Если у сайта есть страницы, то кроме того, что дать прямую ссылку, я всегда могу сказать кому-то: ты там на N-странице, на M-месте. А если автоподгрузка: ты крути страницу и гляди внимательнее. Видимо поэтому в поисковой выдаче AJAX-автоподгрузка используется редко.

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

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

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

Подборка ссылок

Поработаем с MongoDb
http://habrahabr.ru/post/127290/

Experimenting with MongoDB from C#
http://odetocode.com/Blogs/scott/archive/2009/10/13/experimenting-with-mongodb-from-c.aspx

The NoSQL Movement, LINQ, and MongoDB – Oh My!
The NoSQL Movement, LINQ, and MongoDB – Oh My!

NoSQL Data Modeling Techniques
NoSQL Data Modeling Techniques

Куда идет NoSQL с MongoDB
http://msdn.microsoft.com/ru-ru/magazine/ee310029.aspx

MongoDB vs. SQL Server 2008 Performance Showdown
MongoDB vs. SQL Server 2008 Performance Showdown

PTOM: The Dependency Inversion Principle
http://lostechies.com/jimmybogard/2008/03/31/ptom-the-dependency-inversion-principle/

StructureMap — краткий справочник для работы (1/3)
http://habrahabr.ru/post/125613/

Феерическая расстановка точек над DI/IOC (контейнерами)
http://www.codehelper.ru/questions/352/феерическая-расстановка-точек-над-diioc-контейнерами

История одного маппера
http://gandjustas.blogspot.com/2010/01/blog-post.html

Ajax отправка данных из формы
http://itfound.ru/45-ajax-otpravka-dannih-formi.html

Backbone.js для «чайников»
http://habrahabr.ru/post/127049/

Javascript for Bootstrap — tabs
http://twitter.github.com/bootstrap/javascript.html#tabs

Написание сложных интерфейсов с Backbone.js
http://habrahabr.ru/post/118782/

Backbone Tutorials
http://backbonetutorials.com/

Backbone Todos
http://documentcloud.github.com/backbone/#examples-todos

jQuery.post()
http://api.jquery.com/jQuery.post/

Tag Cloud in ASP.NET MVC using Clickable HTML 5 Canvas Elements
http://www.dotnetcurry.com/ShowArticle.aspx?ID=785

Creating tag cloud using ASP.NET MVC and Entity Framework
http://weblogs.asp.net/gunnarpeipman/archive/2011/04/28/creating-tag-cloud-using-asp-net-mvc-and-entity-framework.aspx

Creating a Tag Cloud using ASP.NET MVC and the Entity Framework
http://www.mikesdotnetting.com/Article/107/Creating-a-Tag-Cloud-using-ASP.NET-MVC-and-the-Entity-Framework

Визуализация графов. Метод связывания ребер
http://habrahabr.ru/post/116758/

Эксперимент с голографическим кодированием и декодированием информации
http://habrahabr.ru/post/120051/

Z̩̣̫̗̙͇̯̣̓̔̆ͭA̳͔̖̔̆͡L̨̤̖͖̃ͫͧ͂ͨ̿̚͢G͓̭̦̺̗̱̲͙ͪ́Ơ̤̝̣̜͕̖̇̄!̼͎̰͔̽ͦ̍ͩ̏̾

http://textozor.com/zalgo-text/