Что преимуществами использования является единая база данных для КАЖДОГО клиента?

Вы можете добавить новую ошибку в ModelStateDictionary, если пользователь существует в db.

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

public class CreateUserVM
{
  [Required]
  public string FullName { set;get;}
  public string LastName { set;get;}
}

И в вашем действии GET make убедитесь, что вы отправляете объект этого

public ActionResult Create()
{
  return View(new CreateUserVM());
}

, и ваше представление будет строго типизировано для нашей модели с плоским представлением

@model CreateUserVM
@using(Html.BeginForm())
{
  @Html.ValidationSummary(false)

  <label>Full Name</label>
  @Html.TextBoxFor(s=>s.FullName)

  <label>Last Name</label>
  @Html.TextBoxFor(s=>s.LastName)

  <input type="submit" />
}

, и ваш метод действия HttpPost будет

public ActionResult Create(CreateUserVM model)
{
    if (ModelState.IsValid)
    {
       var exist= db.Users.Any(x => x.FullName == model.FullName)
       if(exist)
       {
          ModelState.AddModelError(string.Empty, "Username exists");
          return View(vmModel);
       }

        var user = new Users()
        {
            FullName = model.FullName,
            LastName = model.LastName
        };
        //Inserting in Parent table to get the Id that we will used in Child table.
        db.Users.Add(user);
        db.SaveChanges();
        return ReidrectToAction("Index"); //PRG pattern
    }
    return View(vmModel);
}
65
задан hlovdal 3 September 2009 в 11:09
поделиться

10 ответов

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

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

Вы также извлекаете пользу из отделимости - это тривиально, чтобы вытащить данные, связанные с данным клиентом и переместить их в различный сервер. Или восстановите резервное копирование того клиента, когда призыв сказать "Мы удалим некоторые ключевые данные!", с помощью встроенных механизмов базы данных.

Вы получаете легкую и свободную мобильность сервера - если Вы outscale один сервер базы данных, можно просто разместить новые клиенты на другом сервере. Если бы они были всеми в одной базе данных, Вы должны были бы или получить более раскормленные аппаратные средства или выполнить базу данных по нескольким машинам.

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

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

47
ответ дан Adam Wright 24 November 2019 в 15:27
поделиться

Вот один подход, который я видел прежде:

  • Каждому клиенту сохранили уникальную строку подключения в основной базе данных клиентов.
  • база данных разработана так, чтобы все было сегментировано CustomerID, даже если существует единственный клиент на базе данных.
  • Сценарии создаются для миграции всех данных о клиентах в новую базу данных в случае необходимости, и затем только, что строка подключения клиента должна быть обновлена для указания на новое местоположение.

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

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

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

13
ответ дан The How-To Geek 24 November 2019 в 15:27
поделиться

Сохранять его простым. Можно быть уверены, что клиент только видит их данные. Клиент с меньшим количеством записей не должен платить штраф необходимости конкурировать с сотнями тысяч записей, которые могут быть в базе данных, но не их. Я не забочусь, как хорошо все индексировано и оптимизировано будут запросы, которые решают, что они должны просканировать каждую запись.

11
ответ дан bruceatk 24 November 2019 в 15:27
поделиться

Ну, что, если один из Ваших клиентов говорит Вам восстанавливать к более ранней версии их данных из-за некоторого испорченного задания импорта или подобный? Вообразите, как Ваши клиенты чувствовали бы, сказали ли Вы им, что "не можете сделать этого, так как Ваши данные совместно используются всеми нашими клиентами" или "Извините, но Ваши изменения были потеряны, потому что клиент X потребовал восстановления базы данных".

10
ответ дан angry person 24 November 2019 в 15:27
поделиться

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

Вот статья об этой точной теме (да, это - MSDN, но это - технология независимая статья): http://msdn.microsoft.com/en-us/library/aa479086.aspx .

Другое обсуждение коллективной аренды, поскольку это касается Вашей модели данных здесь: http://www.ayende.com/Blog/archive/2008/08/07/Multi-Tenancy--The-Physical-Data-Model.aspx

9
ответ дан Nathan 24 November 2019 в 15:27
поделиться

Масштабируемость. Безопасность. Наша компания использует 1 дБ на потребительский подход также. Это также делает код немного легче поддержать также.

6
ответ дан Darren Kopp 24 November 2019 в 15:27
поделиться

Я просто добавляю этот ответ для включения слова, многопользовательского здесь. Я искал это, с помощью "многопользовательского" в качестве запроса, и этот не появился.

4
ответ дан Daniel Magliola 24 November 2019 в 15:27
поделиться

Спасибо за Ваш вход - все превосходные и очень актуальные вопросы. Я предполагаю, что больше смотрю на гибкость обновления. Если необходимо изменить схему для добавления новой опции (позволяет, говорят для веб-приложения) или улучшать существующие функции, просто сделать в единой базе данных. Если необходимо было копировать это изменение через 1 000 отдельных баз данных, шанс ошибочных увеличений. Что, если операция перестала работать? Сколько времени занимает обновить каждый клиент?

, Если надлежащие резервные копии сохранены (или если Ваша база данных была структурирована, где данные на самом деле никогда не перезаписывались), восстанавливая данные для конкретного клиента тривиально.

простота кода, в то время как важный, действительно не становится чрезвычайно сложной. В зависимости от используемого языка и методологии, просто создать объекты, которые представляют только, что определенный клиент (которые хранят конкретный Клиентский идентификатор) и остальная часть проекта только должен быть кодирован для отдельного объекта (вид подобных единственный клиент).

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

3
ответ дан Ryan 24 November 2019 в 15:27
поделиться

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

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

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

я интересовался бы слушанием немного большего количества контекста от Вас на этом, потому что кластеризация не является простой темой и является дорогой для реализации в мире RDBMS. Существует большой разговор/бравада о кластеризации в нереляционном мировом Google Bigtable и т.д., но они решают различный набор проблем и теряют некоторые полезные функции от RDBMS.

2
ответ дан Brian Lyttle 24 November 2019 в 15:27
поделиться

Существует несколько значений "базы данных"

  • аппаратное поле
  • под управлением программное обеспечение (например, "оракул")
  • определенный набор файлов данных
  • конкретный вход в систему или схема

, вероятно, что Joel имеет в виду один из нижних уровней. В этом случае это - просто вопрос управления конфигурированием ПО..., Вы не должны исправлять 1 000 программных серверов для исправления ошибки безопасности, например.

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

0
ответ дан Mark Harrison 24 November 2019 в 15:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: