Каков наилучший способ создать базу данных для хранения записей с большим количеством значений?
Я хочу создать базу данных для событий и отслеживать большую статистику об этом.
Опция 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
Для получения более подробной информации Использование общих табличных выражений