Лучше иметь сотни столбцов или разбить на несколько таблиц?
Я разрабатываю базу статистических данных о работе механического оборудования. Каждый пакет данных будет содержать сотни статистических данных, поэтому я пытаюсь решить, создавать ли одну таблицу с сотнями столбцов или разбивать ее на несколько таблиц, каждая из которых содержит связанную статистику. Например, у меня может быть одна таблица, содержащая статистику, связанную с неисправностями, другая таблица со статистикой, связанной с пробками и т. д.
использование нескольких таблиц это сделало бы систему более сложной в целом, хотя концептуально мне было бы легче иметь дело с несколькими меньшими таблицами, чем с одной большой.
будут ли какие-либо преимущества производительности для разделения вещей? Похоже, что запрос таблицы с несколькими десятками столбцов, вероятно, будет быстрее, чем запрос с сотнями столбцов.
есть ли у кого-нибудь опыт в таких вещах? Я использую Oracle для этого проекта, хотя это-то я вероятно, столкнуться с базами данных в будущем, поэтому ответы для любой базы данных будут оценены.
6 ответов
Я думаю, что нам нужно знать больше о вашем дизайне, чтобы ответить правильно. Например, мне любопытно, что может быть много столбцов, связанных с неисправностями, много (разных), связанных с замятиями и т. д. (Не является ли затор просто своего рода неисправностью?)
ваш дизайн нормализован? Предположительно, у вас нет столбцов типа "jam1", "jam2" и т. д.?!
предполагая, что дизайн хорош и нормализован, решение о том, иметь ли одну широкую таблицу или много более узких это компромисс между различными факторами:
- все / большинство записей имеют статистику всех типов? Да => одна таблица, нет => много
- вам часто нужно запрашивать статистику всех типов вместе? Да => одна таблица, нет => много
- вы поддерживаете все различные статистики вместе на одном экране? Да => одна таблица, нет => много
- вы, вероятно, попадете в какие-либо ограничения базы данных, например, Макс 1000 столбцов на таблицу?
каким бы путем вы ни пошли, вы можете использовать представления, чтобы представить альтернативную структуру для удобства разработчика:
- одна таблица: много просмотров, которые выбирают статистику определенных типов
- многие таблицы: представление, которое объединяет все таблицы вместе
обновление
из ваших комментариев я теперь знаю, что у вас есть количество замятий в 40 разных местах на машине, а другие типы статистики-это количество сходный характер. Это предполагает следующую конструкцию таблицы:
create table machines (machine_id ... primary key, ...);
create table machine_stats
( machine_id references machines
, stat_group -- 'jams', 'malfunctions' etc.
, stat_name -- 'under the hood', 'behind the door' etc.
, stat_count
);
как кто - то прокомментировал ниже, это позволяет вам легче суммировать статистику-внутри или между типами статистики. Он также легко расширяется, если новый стат должен быть добавлен к типу стата.
когда я вижу сотни столбцов в таблице, я склонен подозревать, что схема данных не была должным образом нормализована. Являются ли сотни столбцов действительно уникальными или это группы похожих вещей, которые можно нормализовать в меньшие таблицы?
Если вы можете уменьшить количество столбцов, вы можете уменьшить общий объем передаваемых данных и, следовательно, повысить производительность на нескольких уровнях. Например, если у вас есть запись, содержащая 1000 байт данных, и вы хотите изменить 1 байт для каждой записи, вы рискуете получить и сохранить 999 байтов без необходимости. Это влияет на производительность.
нормализация гарантирует, что вы не повторяете данные в свои схемы.
есть ограничения на то, как далеко вы должны идти, конечно. Соединения для 7 или более таблиц не являются исполнительными.
но один стол монстра? Я бы порвал с ним.
вы имеете в виду 100s типов статистики?
некоторые медицинские базы данных попробовали схему или идиому, которая называется "значение атрибута сущности" или " EAV " (вы можете Google эти термины): рассуждение заключается в том, что существует бесчисленное множество различных типов фактов о пациенте, которые могут или не могут быть захвачены для любого данного пациента, и что EAV-лучший способ сохранить это, чем иметь бесчисленные разные столбцы в таблице.
остерегайтесь, однако, что EAV спорный: некоторые говорят, что это" запах кода " и типичная ошибка новичка; другие говорят, что это полезно иногда (или редко), но зависит от (указания и наличия) хорошей поддержки метаданных.
мне не нравятся таблицы со слишком большим количеством столбцов. Один из вариантов, который вы можете рассмотреть, - сохранить статистику в виде строк в таблице статистики:
CREATE TABLE Statistics (id AS INTEGER PRIMARY KEY, statusType As VarChar,
statusValue As Float);
затем вы просто добавляете новую строку для каждого отслеживаемого состояния. Это намного чище с точки зрения БД, но это делает получение данных сложнее для отчетов.
в этой ситуации я бы создал пару таблиц. Одна бы машина стола. Будет поиск проблемы в таблице. Наконец, таблица соединений между ними, которая также содержит информацию, связанную со статусом. Обслуживание будет проще, и писать сумасшедшие отчеты будет проще. Кроме того, добавление новых типов статусов также будет проще.
machine
id
name
description
status_flag
id
caption
machine_history
machine_id
status_flag_id
information
тогда вы можете делать такие вещи, как: выберите count (distinct machine_id) из machine_history, где status_flag_id = 23 и информация
единственное, что информационное поле в таблице machine_history может содержать числа или символы. Если это так, я бы создал два информационных поля, чтобы вы не препятствовали производительности.
также я предполагаю, что есть компонент программирования, который позволит вам создать некоторые методы для работы с этими данными.