Задать вопрос
arturich
@arturich

Как парвильно настроить распределение данных?

Хочется узнать это вообще возможно?

Что у нас есть:

  1. СУБД Postgresql
  2. 10-20 таблиц с разными данными в которых предполагается до 7 млрд записей в каждой
  3. Все записи так или иначе принадлежат сущности — “Рекламная кампания”


Что хочется:
  1. Разбить данные на части внутри одного сервера и, если новые данные не влезают на данный сервер (по нашим критериям, например: количество кампаний на одном сервере на более 1 млн.), записывать их на другой свободный (пока не важно кто принимает решение на какой именно).
  2. Обязательно! Одна “Рекламная кампания” и все подчиненные ей записи на одном сервере, так как много связанных запросов. Это нужно, чтобы исключить запросы на более, чем один сервер для получения любой информации по кампании.
  3. Представление каждой таблицы должно быть простым — т.е. клиентский код должен просто запрашивать/добавлять/обновлять данные из единой таблицы. Типа того — просто SELECT * FROM “data”.”campaigns” и т.п, хотя при этом как я писал выше эта таблица должна биться на части для быстрого поиска так как обычно работает с одной “Рекламной кампанией” за раз.
  4. Хочется работать без спец. хранимых процедур.


Для чего это всё?

Не хочется хранить такой большой объем данных на одном сервере в одной таблице (под этим я понимаю каждую из «10-20 таблиц с разными данными»), так как существенно замедляется поиск данных — например иногда надо искать по тексту, но при этом мы знаем в какой «Рекламной кампании» она. Но так как индекс общий — большие кампании будут мешать маленьким.
  • Вопрос задан
  • 2957 просмотров
Подписаться 3 Оценить 1 комментарий
Пригласить эксперта
Ответы на вопрос 4
@alz
А просто шардинг Вам не подходит?
Ответ написан
@alz
Вся логика на клиенте. Если клиент для определенного id все время работает с одним и тем же сервером, то на других серверах ничего и не будет
Ответ написан
dbmaster
@dbmaster
На мой взгляд получается противоречие в требованиях: с одной стороны разделение данных, а с другой стороны — выборка из одного места.

Возможные варианты:
* partitioning + репликация
* дополнительные индексы включающие в себя id кампании
* экзотические решения sqlrelay.sourceforge.net/sqlrelay/router.html (не проверял)
Ответ написан
@ToSHiC
www.postgresql.org/docs/8.1/static/ddl-partitioning.html

В качестве ключа, по которому делается партиционирование, во всех таблицах надо указать id кампании.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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