2015-06-07 3 views
0

Я хочу создать таблицу о «пользователях» для каждого из 50 состояний. Каждое состояние имеет около 2 ГБ данных. Какой вариант звучит лучше?Рекомендации по созданию огромной таблицы SQL

  1. Создать одну таблицу под названием «пользователи», которые будут 100GB большой ИЛИ
  2. Создание 50 отдельных таблиц, называемых «users_ {состояние}», каждый из которых будет 2GB большой

Я ищу на двух вещах: производительность и стиль (лучшие практики)

Я также использую RDS на AWS, и у меня достаточно места для хранения. Есть предположения?

РЕДАКТИРОВАТЬ: Из-за внешнего вида мне не понадобится информация из нескольких состояний в одно и то же время (т. Е. Не нужно будет часто присоединяться к таблицам, если я иду с Вариантом 2). Ниже приведен общий пример: передняя часть передает идентификатор состояния на внутренний сервер, и на основе этого идентификатора мне нужно запрашивать данные из db относительно указанного состояния и возвращать данные обратно в интерфейс.

+0

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

ответ

0
  • Являются ли 50 государств действительно независимыми в вашей бизнес-логике? Значит, ваши запросы должны были работать только в течение определенного состояния в большинстве случаев? Если это так, то расщепление по состоянию, вероятно, является хорошим выбором. В этом случае вам нужно будет только присоединяться к относительно более редким запросам, таким как запросы на публикацию и т. Д.

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

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

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

Обратите внимание, что мой ответ предполагает более распространенные сбои частоты доступа: высокие показатели чтения, умеренные обновления, низкий создает/удаляет. Кроме того, если ваша основная задача связана с производительностью больших данных, вы можете проверить NoSQL (например, Amazon AWS DynamoDB), но это было бы инвазивным и фундаментальным отходом от реляционной системы. Но преимущества производительности NoSQL могут быть абсолютно драматичными.

0

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

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

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

Смежные вопросы