Уже прочитав несколько вопросов о SO, внешних постах в блоге и руководстве
- SO : ограничение внешнего ключа для секционированной таблицы в Pg
- dba.SE : Различные способы обработки FK для секционированной таблицы в Pg
- Руководство : Наследование
- Руководство : разметка
- Руководство : триггеры ограничения
- Блог : Postgres моделирование с наследованием
Я все еще задаюсь вопросом, должен ли я пойти с разделением, рассматривая мой случай или нет.
Корпус - упрощенный
Хранение данных клиентов. Все названия таблиц, упомянутых ниже, составлены для ясности.
Наличие объектов, которые могут быть идентифицированы клиентом и являются нефизическими существами, а также их физические объекты, в которых они фактически хранятся в случае необходимости отправить некоторые объекты обратно клиенту по требованию или обработать его другими способами. Они отображаются в отношениях «многие ко многим».
objects_nonphysical
,objects_physical
,objects_mapping_table
.Второе отношение «многие ко многим» заключается между этими нефизическими объектами и их метриками. Есть объекты, которые связаны с некоторыми метриками.
metrics
,metrics_objects_nonphysical
Как нефизические, так и физические объекты имеют свои иерархические таблицы, которые являются дочерними и родительскими отношениями.
objects_nonphysical_hierarchy
,objects_physical_hierarchy
В зависимости от потребностей и требований каждого клиента данные о физических объектах могут быть предоставлены или могут потребоваться создавать с нуля. В основном, что мне нужно сделать, это:
Поддерживайте внутреннюю систему для постов
INSERT
иSELECT
выписок, потому что именно здесь будет происходить отображение.Поддерживать систему для внешнего клиента, чтобы просматривать и управлять своими нефизическими объектами - быстрый поиск данных. Сильная потребность в эффективности
SELECT
выписок - эти данные доступны для поиска большинству клиентов в любое время.
Мое рассмотрение
Может быть клиент, который может получить доступ к данным, просматривать их и работать с ними, но это не обязательно должен быть подрядчик, для которого мы получили данные или обрабатываем данные.
Это привело меня к введению разбиения таблиц в мою систему, учитывая, что я всегда знаю, в какие данные раздела следует попасть ( разделение для подрядчиков ), а затем для поддержки системы для внешнего клиента, где мне нужно разделение для клиентов (это было бы сделано с некоторыми откладывайте использование инструментов автоматизации и набора правил для перезаписи данных в соответствии с требованиями клиентов, чтобы для каждого клиента мы сканировали только один раздел для каждой таблицы.
Объем данных
Мои данные будут постоянно расти, особенно при импорте объектов и метрик новых клиентов. Темпы поступления новых данных в систему в настоящий момент непредсказуемы в долгосрочной перспективе. Нет никакого способа измерить это, не зная, кто будет следующим клиентом. В настоящее время есть только 2 клиента с более или менее 1М строками для каждого клиента в каждой таблице. Но в будущем я ожидаю, что новые клиенты также будут иметь объем порядка 10 миллионов строк.
Вопросов
Все эти вопросы связаны друг с другом.
- Должно ли разделение действительно рассматриваться здесь, или это перебор? Я считаю, что это полезно, так как я всегда сканирую ровно один раздел.
- Если разделение - это путь, как мне
FK
наиболее эффективно применять ограничения с учетом моих потребностей? Должен ли я пойтиconstraint triggers
или просто оставить его на уровне приложений для внутренней системы, или, может быть, какой-то другой метод? - Если разделение не путь, во что я должен погрузиться?
Если предоставленных данных недостаточно, пожалуйста, дайте мне знать в комментариях ниже.