Я относительно новичок в колледже, так что большая часть моего знакомства с реляционными базами данных происходит из моего курса по базам данных, где что-либо не в BCNF или 3NF - это пародия. Конечно, это один крайний край, но моя команда на работе действительно, кажется, доводит его до совершенно противоположного конца.
В наших схемах микросервисных БД сущности редко имеют более одной таблицы. Все, что вы обычно нормализуете в другую таблицу, хранится в столбце json. Если позже обнаружится, что необходимо запросить одно из свойств в этом json, добавляется новый столбец, и данные хранятся в обоих местах (да, в двух разных столбцах одной и той же таблицы).
Во многих случаях эти столбцы JSON определенно имеют преимущество. Если вам никогда не нужно запрашивать эти данные и если вам никогда не придется вносить односторонние изменения в эти данные (что вы, очевидно, не можете предсказать), это неплохая идея. Кроме того, многие из наших служб либо не видят сервер, либо размещаются на машинах с неприличным объемом дискового пространства, необходимого для них, поэтому дублирование данных не является большой проблемой. (Хотя кое-что я бы вообще хотел избежать из философии)
В настоящее время мы создаем сервис, который соответствует правилам на основе набора принадлежащих им условий, а затем выполняет набор действий, связанных с этими правилами, когда правила выполняются (например, все условия выполняются). Моя подгруппа, которая скорее всего создаст этот сервис, считает, что есть существенная выгода от нормализации действий и условий вне правил в схеме. Очевидно, что эти таблицы поддерживают отношения внешнего ключа с идентификатором правила. С нашей точки зрения, мы можем избежать дублирования данных в условиях, позволяющих нам гарантировать, что они оцениваются только один раз, и легко найти условия и правила, которые нам нужны, когда они нужны, без необходимости извлекать каждое отдельное правило и выполнять поиск в памяти.
Разговаривая сегодня с одним из наших главных инженеров, он попытался оттолкнуть меня от этой схемы. Попытка всячески спорить о том, что нам это на самом деле не нужно, в будущем вызовет проблемы с производительностью, ссылаясь на наш старый монолит, который является пародией на дизайн. Он назвал то, что мы делаем, «старым способом», а плоские таблицы с json - «новым способом». Он утверждал, что в местах, где мне нужна атомарность, она нам не нужна, и что вместо запросов мы должны делать больше вещей в памяти. Это принцип дизайна, которому следуют многие наши услуги. Мы не ожидаем, что объем наших данных существенно возрастет, что должно ускорить наши запросы. Мы ожидаем много времени, потраченного на оценку правил и выполнение действий.
Я понимаю, что нереляционные базы данных стали более популярными в последние годы, но даже при активном поиске информации о влиянии на производительность отношений с ключевыми ключами я не вижу много информации, подтверждающей его обоснованность. Я полагаю, что они могут вводить большие транзакции, которые могут вызывать проблемы, но это кажется проблемой, независимой от самого внешнего ключа.
Это моя наивность? Или это действительно то, чего мне и моей подгруппе не хватает? Я явно не дал подробную информацию о нашей проблеме, потому что я не обязательно ищу решение этой проблемы. Учитывая, что это общая тенденция в нашей большой команде, мне действительно любопытно, если они что-то с этим делают.
источник
Ответы:
Ключевое слово здесь, чтобы понять, откуда приходит ваша команда - это «микросервисы». Стоит сначала прочитать эту концепцию, особенно для следующей информации:
Как и в случае с любым относительно новым способом ведения дел (а 5-10 лет - относительно новый, когда дело доходит до архитектуры программного обеспечения), вы обнаружите, что идеалы и реальность немного отличаются.
Одним из идеалов является то, что каждый микросервис должен иметь свое собственное хранилище данных. ПРИМЕЧАНИЕ: я сказал хранилище данных, а не базы данных. Есть случаи, когда вам просто нужна поисковая система, хранилище больших двоичных объектов или простое кэширование, а не обычная база данных. В зависимости от того, с кем вы говорите, этот идеал может даже пойти в хранилище данных для каждого экземпляра микросервиса!
Суть в том, что когда вы говорите о переходе на интернет-масштабирование, безопасность и привычность транзакций ACID (атомарность, согласованность, изоляция и долговечность) просто не масштабируются, когда в одной базе данных находятся миллионы пользователей. С появлением NoSQL, парадигма больше сместилась в сторону BASE (в основном доступно, мягкое состояние, возможная согласованность). ( ссылка )
Существует влияние изменения PH того, как вы управляете данными:
Я не могу ответить за детали вашей команды или за то, насколько крупными они намерены получить решение, но обычно вам не нужно иметь решение «все или ничего». Я не собираюсь сидеть здесь и судить, делает ли команда правильный выбор. Я просто предоставляю вам некоторый контекст, чтобы вы могли хотя бы понять, откуда они берутся.
источник
Хорошо, не будучи главным инженером проекта, вы действительно должны следовать его указаниям для этого проекта.
Я бы посоветовал вам проработать свой собственный дизайн системы и создать ее прототип, чтобы вы понимали любые компромиссы. Делайте это для собственного образования и упоминайте об этом на работе только тогда, когда вы можете продемонстрировать рабочие примеры.
Мой опыт показывает, что ограничения приводят к снижению производительности базы данных. И да, это так, вы должны проверить эти ограничения. Тем не менее, это гораздо более серьезная проблема, когда база данных несовместима, и это заставит вас писать SQL и больше кода для компенсации, часто увеличивая сложность системы, а также замедляя ее.
3nf, если все сделано правильно, сделает базу данных быстрее, потому что большая ее часть может быть кэширована, так как будет сохранено меньше избыточных данных. Однако в вашей текущей работе может быть недостаточно большой набор данных, чтобы реально увидеть разницу в производительности между нормализованной и ненормализованной базой данных.
источник
Я думаю, что они боятся воссоздать ту же старую "пародию", которая была там раньше, а не саму Ссылочную целостность.
Если вы можете привести веские аргументы (так называемые нефункциональные требования) для того, чтобы нуждаться в атомарности, то им понадобится хороший, твердый контраргумент, чтобы отказаться от его предоставления.
Будем надеяться, что ты прав. Я бы предположил, что полагаться на то, что данные остаются «достаточно маленькими», чтобы оставаться производительными, рискованно.
Кроме того, какова скорость изменения этих Правил? Чем больше у вас дублирования, тем больше времени (или денег) вы будете тратить на обновление одной и той же вещи в нескольких местах.
источник
Ключевые концепции СУРБД насчитывают более 40 лет. В то время хранилище было очень дорогим, и всякого рода избыточность не одобрялась. В то время как концепции, лежащие в основе СУРБД, все еще здравы, идея денормализации для производительности (для сокращения объединений) стала общепринятой в последние десятилетия.
Таким образом, для СУБД заданного размера у вас обычно есть логический дизайн (без избыточности) и физический дизайн (с избыточностью) для производительности.
Перенесемся в будущее, где хранилище дешево, а процессоры работают быстрее, чем когда-либо, некоторые из этих нагрузок на проектирование не так важны. В конечном счете это субъективное решение относительно того , вы заботитесь о избыточности и бесхозных записях. Для некоторых отраслей, таких как банковское дело, правильность данных имеет жизненно важное значение, поэтому трудно понять, как они вообще отойдут от РСУБД. Что касается других отраслей, новые игроки все время выходят на рынок, поэтому выбор огромен.
Что касается того, что вашей команде не нравятся ограничения, которые может привести СУБД - кто знает? Конечно, у младших разработчиков, которых я вижу, нет той СУБД, которую имели разработчики предыдущих поколений, но это, вероятно, больше связано с распространением технологий для разработчиков и платформ баз данных.
Нет конца технологиям, которые разработчик может изучить, и может быть трудно сделать правильный выбор для вашей карьеры. Конечно, времена разработчиков, которые были мастером на все руки, давно прошли - слишком многому можно научиться.
Но - к вопросу в руках. По вашему собственному признанию, вы не ожидаете, что объемы данных будут расти, и система работает хорошо. Для вас было бы довольно сложно продать идею реинжиниринга вещей без ощутимой выгоды. Возможно , если вы могли бы сделать доказательство концепции , где подход RDBMS же извлечь выгоду, это будет другая история.
источник
Это зависит от того, какую базу данных вы используете.
В традиционной РСУБД вы правы. Дублирование данных - мерзость. Столбцы и их json-эквивалентность неизбежно выйдут из синхронизации, потому что нет ничего, что могло бы обеспечить их соблюдение. Поддержка внешнего ключа хорошо известна, отлично справляется с описанием и обеспечением взаимосвязей. А атомарность жизненно важна для того, чтобы делать практически все с данными.
В настройках типа nosql это менее понятно. Поскольку нет твердых отношений, соблюдение отношений становится менее важным. Такого рода контент json с индексом столбца гораздо чаще встречается в этих системах, потому что отсутствие отношений означает, что его вероятность не синхронизироваться. А атомарность ограничена одной таблицей, потому что так работает nosql.
Что лучше, зависит от того, что вы на самом деле делаете, и что вам действительно нужно.
Но это звучит так, как будто ваши коллеги заняты культом грузов. Их укусили старые плохие вещи, так что теперь вещи должны быть новыми блестящими. Через несколько лет, когда их укусила новая блестящая вещь, они, надеюсь, поймут, что SQL против noSQL - это набор компромиссов.
Но они не будут. Надеюсь, вы все равно.
источник