Шардинг SQL Azure и приложения для социальных сетей

Концепция сегментирования в SQL Azure является одним из наиболее рекомендуемых вариантов для преодоления ограничения размера БД в 50 ГБ, которое есть на данный момент. Ключевой стратегией в сегментировании является группировка связанных записей, называемых атомарными единицами, вместе в одном сегменте, чтобы приложению для извлечения данных требовалось запрашивать только один экземпляр SQL Azure.

Однако в таких приложениях, как приложения для социальных сетей, группировка атомарной единицы в один сегмент нетривиальна из-за взаимосвязанности сущностей и записей. какой может быть рекомендуемый подход, основанный на таком сценарии?

Также в сегментированной БД, какие первичные ключи следует использовать для таблиц? Большое целое или GUID. В настоящее время я использую столбцы BIGINT Identity, но если бы данные по какой-то причине должны были быть объединены, это было бы проблемой из-за конфликтов между значениями в разных осколках. я слышал, что некоторые люди рекомендуют GUID (UniqueIdentifier), но я опасаюсь, как это может повлиять на производительность. Индексирование локальных серверов SQL со столбцами UniqueIdentifier невозможно, и мне интересно, как SQL Azure реализует аналогичные стратегии, если бы я использовал столбец UniqueIdentifier.


person Azwaan    schedule 11.02.2011    source источник


Ответы (1)


Для приложения для социальных сетей я бы сознательно отказался от использования SQL и вместо этого использовал решение noSQL, такое как MongoDB или Azure Table Storage. Эти ненормализованные, но недорогие системы позволяют создавать несколько наборов данных сущностей, которые настраиваются в соответствии с вашими различными потребностями в индексировании.

Итак, вместо того, чтобы иметь что-то вроде... Пользователь1 -‹ отношения -‹ Пользователь2

Вместо этого у вас будут такие таблицы, как Пользователи Друзья пользователя 1 Друзья пользователя 2

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

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

person BrentDaCodeMonkey    schedule 11.02.2011
comment
я знаю о вариантах на основе NOSQL и даже о хранилище таблиц Azure, однако это, безусловно, значительно увеличит время разработки, поэтому на данный момент мы придерживаемся подхода реляционной базы данных. - person Azwaan; 11.02.2011
comment
Затем я бы рассмотрел возможность размещения RBDMS в другом месте (Amazon, Rackspace и т. д.). Это позволит вам создавать большие БД на более мощных виртуальных машинах. Просто убедитесь, что вы установили уровень кэширования, чтобы помочь контролировать затраты и повысить производительность. Лично я все еще изучаю маршрут noSQL. Это решение, которое будет лучшим для вас в долгосрочной перспективе. Даже если вы делаете это только смешанным образом (индексы в SQL Azure, хранилища данных в Azure Storage). - person BrentDaCodeMonkey; 11.02.2011
comment
Предполагая, что я выберу БД NOSQL, работающую в Azure, как бы вы оценили базу данных Graph (учитывая, что базы данных Graph имеют множество функций, адаптированных для сценариев типа социальных сетей), таких как Neo4J или Sones GraphDB, по сравнению с хранилищем таблиц Windows? - person Azwaan; 23.02.2011
comment
Я постараюсь проверить это и сообщить вам. Один из других Azure MVP работает над чем-то, что может быть похоже на ваш проект. Так что может быть полезно, если я смогу соединить вас двоих. :) - person BrentDaCodeMonkey; 23.02.2011