Иметь несколько копий таблиц в базах данных для простого запроса на объединение или данные связаны в программе?

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

например:

db_trade используется для хранения торговой информации

db_fund используется для хранения учетной записи пользователя

db_auth используется для аутентификации и авторизации

В этом случае user_info является общей информацией.

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

Я не знаю, как спроектировать большую систему:

Выполнить ассоциацию данных в программе? Синхронизировать таблицу user_info в каждой базе данных?

1 ответ

Решение

У каждого подхода есть свои плюсы и минусы:

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

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

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

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

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

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

Другие вопросы по тегам