Каков наилучший способ создать базу данных для хранения записей с большим количеством значений?

Я хочу создать базу данных для событий и отслеживать большую статистику об этом.

Опция 1

Создать одну таблицу для Events и поместите всю мою статистическую колонку в это. Например, число мужчин, число женщин, число неопознанных полов, температура в тот день, время, когда он начался, какие-либо драки, вызов полиции и т. Д.

Запрос будет очень простым select * from events

Вариант 2

Создайте две таблицы, одну для Events и один для EventsAttributes, в Events Таблица Я хотел бы хранить важные вещи, такие как идентификатор, название события и время начала / окончания.

В EventsAttributes Я бы сохранил всю статистику событий и связал бы их с Events с eventId иностранный ключ.

Запрос будет выглядеть следующим образом. (attributeType == 1 будет представлять количество мужчин)

select e.*, (select ev.value from EventAttributes ev where ev.eventId = e.id and attributeType = 1) as NumberOfMale from Events e

Запрос будет не таким простым, как вариант 1, но я хочу разработать его правильно и жить по грязному запросу.

Итак, какой вариант является правильным способом и почему (я не администратор базы данных, но мне любопытно).

Спасибо за ваше время.

1 ответ

Я предпочитаю использовать вариант 2 для проектирования базы данных.

В этом варианте (2) вы применяете лучшие практики нормализации базы данных.

Есть три основные причины для нормализации базы данных:

  • Первый - минимизировать дублирующиеся данные.

  • Второе - минимизировать или избежать проблем с модификацией данных.

  • Третье - упростить запросы.

Для получения более подробной информации читайте Проектирование нормализованной базы данных.

Вы можете создавать представления (запросы) на основе этой нормализованной базы данных для поддержки Option (1).

Таким образом, база данных будет готова для любого будущего масштабирования.

Обновить:

Вы можете использовать ценные операторные сводные и общие табличные выражения (CTE), чтобы получить eventAttributes1, eventAttributes2, ...

Предположим, что ваши таблицы:events и event_attributes, как описано ниже:

    events
   ----------
    # event_id
    event_title
    start_date
    end_date

    event_attributes
    -------------
    #event_id
    #att_type
    att_value

    # is primary key

    -- using table expression (it's like a dynamic view)

    with query as (
    select e.event_id, e.event_title,a.att_type, a.att_value
    from events e
    join event_attributes a on e.event_id =a.event_id
    )
    select event_id , event_title,
    [1] as eventAttributes1, -- list all eventAttributes1 numbered [1],[2],...
    [2] as eventAttributes2
    [3] as eventAttributes3
    FROM query  
    PIVOT(SUM(att_value) FOR att_type IN ([1],[2],[3])) as pvt

Для получения подробной информации о Pivot читайте: Использование PIVOT

Для получения более подробной информации Использование общих табличных выражений

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