Если вы не инициализировали ссылочный тип и хотите установить или прочитать одно из его свойств, он будет генерировать исключение NullReferenceException.
Пример:
Person p = null;
p.Name = "Harry"; // NullReferenceException occurs here.
Вы можно просто избежать этого, проверив, является ли переменная не нулевой:
Person p = null;
if (p!=null)
{
p.Name = "Harry"; // Not going to run to this point
}
Чтобы полностью понять, почему выбрано исключение NullReferenceException, важно знать разницу между типами значений и ссылочные типы .
Итак, если вы имеете дело со типами значений, NullReferenceExceptions не может произойти. Хотя вам нужно поддерживать оповещение при работе со ссылочными типами!
Только ссылочные типы, как следует из названия, могут содержать ссылки или буквально буквально ничто (или «нуль»). Если типы значений всегда содержат значение.
Типы ссылок (эти должны быть проверены):
Типы значений (вы можете просто игнорировать эти):
У меня такая же проблема, чтобы решить, а также рассмотреть варианты. Поскольку у меня есть многолетний опыт создания многосайтовых приложений SaaS, я также собирался выбрать второй вариант, основанный на моем предыдущем опыте работы с реляционными базами данных.
Во время моего исследования я нашел эту статью на сайте поддержки mongodb : http://support.mongohq.com/use-cases/multi-tenant.html
Ребята заявили, что избегают 2-х опций любой ценой, которые, как я понимаю, не особенно специфичный для монгоба. У меня сложилось впечатление, что это применимо для большинства исследований NoSQL, которые я исследовал (CoachDB, Cassandra, CouchBase Server и т. Д.) Из-за специфики дизайна базы данных.
Коллекции (или ведра или, тем не менее, они называют это в разных БД) - это не то же самое, что и схемы безопасности в РСУБД, несмотря на то, что они ведут себя как контейнер для документов, которые они бесполезны для применения хорошего разделения арендаторов. Я не мог найти базу данных NoSQL, которая может применять ограничения безопасности на основе коллекций.
Конечно, вы можете использовать защиту на основе ролей mongodb для ограничения доступа на уровне базы данных / сервера. ( http://docs.mongodb.org/manual/core/authorization/ )
Я бы порекомендовал 1-й вариант, когда:
Я бы пошел на вариант 3, если:
Если вы разместите дополнительную информацию о своем приложении, возможно, я смогу дать вам более подробные советы.
В MSDN имеется разумная статья о архитектуре данных с несколькими арендаторами , о которой вы могли бы обратиться. Некоторые ключевые темы, затронутые в этой статье:
Также затронуты некоторые шаблоны конфигурации программного обеспечения как службы (SaaS).
Кроме того, стоит использовать gander интересная запись из парней SQL Anywhere .
Мой собственный личный подход - если вы не уверены в принудительной безопасности / доверии, я бы пошел с вариантом 3, или если проблема масштабируемости запретить возврат к варианту 2 как минимум. Тем не менее ... Я не профессионал с MongoDB. Я очень нервничаю, используя общую «схему», но я с радостью отнесусь к более опытным практикующим.
Я нашел хороший ответ в комментариях по этой ссылке:
http://blog.boxedice.com/2010/02/28/notes-from-a-production-mongodb -deployment /
В принципе вариант # 2, кажется, лучший способ пойти.
Цитата из комментария Дэвида Миттона:
Мы решили не иметь базу данных для каждого клиента из-за того, как MongoDB выделяет свои файлы данных. Каждая база данных использует собственный набор файлов:
Первый файл для базы данных - dbname.0, затем dbname.1 и т. Д. Dbname.0 будет 64MB, dbname.1 128MB и т. Д. ., до 2 ГБ. Когда файлы достигают 2 ГБ, каждый последующий файл также имеет 2 ГБ.
Таким образом, если последний файл данных присутствует, например, 1 ГБ, этот файл может быть на 90% пустым, если он был недавно достигнут.
из руководства.
По мере того, как пользователи подписываются на пробную версию и уходят, мы получим все больше и больше баз данных размером не менее 2 ГБ, даже если весь файл данных не использовался. Мы обнаружили, что для этого используется огромное количество дискового пространства по сравнению с наличием нескольких баз данных для всех клиентов, где дисковое пространство может быть использовано для максимальной эффективности.
Облицовка будет стандартной для сбора, что представляет проблему где коллекция никогда не достигает минимального размера, чтобы начать ошпаривание, как это имеет место для многих наших (например, коллекции просто хранят данные для входа пользователя). Однако мы просили, чтобы это также можно было выполнить на уровне каждой базы данных. См. http://jira.mongodb.org/browse/SHARDING-41
Нет компромиссов с производительностью, использующих множество коллекций. См. http://www.mongodb.org/display/DOCS/Using+a+Large+Number+of+Collections
Согласно моим исследованиям в MongoDB. Trucos y consejos. Aplicaciones multitenant. эта опция не рекомендуется, если вы не знаете, сколько арендаторов вы можете иметь, это могут быть тысячи, и это будет сложно, когда дело доходит до осколков, также представьте, что у вас есть тысячи коллекций в одной базе данных. .. Поэтому в вашем случае рекомендуется использовать вариант 1. Теперь, если у вас будет ограниченное число пользователей, это уже по-другому, и да, вы могли бы использовать второй вариант, как вы думали.
В то время как обсуждение здесь посвящено NoSQL и в первую очередь MongoDB, мы в Citus используют PostgreSQL и создаем базу данных с распределенными / распределенными многоуровневыми данными.
Использование нашего Руководство по перемещению просматривает пример приложения, охватывающий схему и различные специфические функции для нескольких арендаторов.
Для более неструктурированных данных мы используем столбец JSONB PostgreSQL для хранения таких данных и данных, относящихся к арендатору.
Я бы выбрал вариант 2.
Однако вы можете установить параметр командной строки mongod.exe --smallfiles. Это означает, что максимальный размер файла составит 0,5 гигабайта, а не 2 гигабайта. Я проверил это с монго 1.42. Таким образом, вариант 3 не является невозможным.