Я работаю в ситуации, когда по нормативным / юридическим причинам мы должны хранить данные каждого клиента в отдельной базе данных. Тем не менее, существует определенная информация, которой нужно делиться, в основном связанная с такими вещами, как таблица поиска, для которой URL-адрес клиента соответствует какой базе данных. Кроме того, клиент может выбрать несколько баз данных, если он хочет логически разделить свои данные. Итак, для каждого из наших продуктов у нас действительно есть три типа баз данных:
- ApplicationData, которая имеет всего несколько таблиц, содержащих информацию о самих клиентах, например, какую базу данных MasterData (см. Ниже) использовать при достижении определенного URL-адреса и какие функции доступны для этого клиента. Каждый продукт имеет только одну ApplicationData, независимо от того, сколько разных клиентов используют этот продукт.
- MasterData, которая содержит специфичную для клиента информацию, такую как пользователи, роли и разрешения (в нашем случае таблицы, которые создает aspnet_regsql, находятся здесь). В число указанных здесь разрешений входят базы данных ClientData, доступные данному пользователю (см. Ниже). Схема для всех баз данных MasterData (для одного и того же продукта) одинакова.
- ClientData, которая содержит данные, с которыми взаимодействует пользователь. В одном продукте это данные, которые клиент может искать по большому количеству критериев, создавать отчеты и т. Д. В другом продукте это динамические данные, которые клиент может загрузить, чтобы другие пользователи могли связываться с людьми для участия в опросах. по телефону и т. д. Схема для всех баз данных ClientData для одного и того же продукта одинакова.
Теперь одно предостережение: мы фактически используем одну и ту же схему и часто одну и ту же реальную базу данных для MasterData и ClientData. Это по историческим причинам, так как возможность разрешить клиенту иметь одну базу данных аутентификации (MasterData), соответствующую ряду баз данных ClientData, является относительно новой функцией, которая применяется только к одному из наших продуктов. Кроме того, эта структура упрощает развертывание, поскольку большинство клиентов используют только одну базу данных ClientData. Однако MasterData и ClientData имеют отдельные модели сущностей в рамках Entity Framework в наших проектах, и мы должны убедиться, что между MasterData и ClientData нет таких прямых связей, как внешние ключи.
Эта установка очень хорошо работает для нас. Одним из основных преимуществ является то, что нет проблем с размещением разных баз данных ClientData на разных серверах. Это очень помогает с балансировкой нагрузки и обеспечивает естественный способ разделения данных. По сути, мы можем предложить клиенту с огромным объемом данных выделенный сервер базы данных, если он готов за это заплатить.
Еще одна вещь, которая действительно помогла нам в этой ситуации, - это инструменты Red Gate, в частности такие инструменты, как Multi-Script, SQL Source Control и Schema Compare. Когда мы что-то модернизируем и схема меняется, мы должны развернуть изменения во всех соответствующих базах данных. Эти инструменты более чем окупили себя за сэкономленное время. Обратите внимание, что я не связан с Red Gate, кроме как как довольный пользователь.
Редактировать: (в ответ на комментарий)
ApplicationData - одна база данных для каждого продукта. Три веб-продукта, которые мы использовали, используют одну и ту же схему для ApplicationData, поскольку они записывают в основном одни и те же типы информации. Тем не менее, нет никаких причин, по которым будет оставаться таким. Все базы данных ApplicationData находятся на одном сервере. Одна из таблиц в ApplicationData указывает на правильное имя сервера и базы данных для MasterData клиента, поэтому MasterData для данного клиента может находиться на любом сервере.
MasterData содержит информацию об имени сервера и базы данных для каждой базы данных ClientData, поэтому базы данных могут находиться на любом сервере.На практике на данный момент у нас всего два сервера баз данных для этих продуктов.Схема MasterData похожа для каждого продукта, но я не думаю, что они абсолютно одинаковы (я должен был бы проверить).Каждый клиент имеет свои собственные MasterData.Если клиент покупает несколько продуктов, для каждого продукта есть MasterData для этого клиента;продукты взаимодействуют другими способами (в основном через веб-сервисы), если клиент приобрел эту функцию (или запрашивает индивидуальную разработку такой функции. ClientData для данного продукта всегда имеет одну и ту же схему.
Итак, вСводка:
- ApplicationData для каждого продукта и имеет одинаковую схему для каждого продукта.
- MasterData для каждого клиента для продукта.
- Есть один илибольше экземпляров ClientData для клиента в продукте.
Я немного упростил задачу в том, что только один из наших продуктов поддерживает несколько экземпляров ClientData для каждого клиента. Для второго продукта это, вероятно, будет реализовано в конечном итоге.третий продукт, он вообще не имеет смысла как функция и, скорее всего, останется без изменений.
Надеюсь, это ответит на ваш вопрос!