@vaydimilmu

Как правильно спроектировать БД?

Добрый день!
Подскажите начинающему как правильно спроектировать БД:
есть таблица с данными о событиях\авариях, одно событие соответствует одному источнику(host), один источник может состоять в нескольких группах и перемещаться между группами.
tblevent: {id, time_start, time_end, name, type, hostid}
tblhost: {id, hostname, groupid}
tblgroup: {id, groupname}
По событиям будет считаться доступность(SLA) в разрезе групп. Как правильно будет связать события с группами? Вижу следующие варианты:
1. Создать таблицу соответствия между событием и группами tblevent2group: {eventid, groupid}, в этом случае как правильно будет выбрать события за период по группе? Одним запросом вытаскивать все события по группе из tblevent2group, а следующим вытаскивать события из tblevent и фильтровать их по времени?
2. В tblhost добавить поля и хранить историю перемещения хоста между группами tblhost: {id, hostid, hostname, date_start, date_end, groupid}
3. в таблицу tblevent добавить поле в котором будут перечислены id групп к которым оно относится, но тогда как правильно будет написать запрос для выборки событий по одной группе?
Заранее благодарен за ответы
  • Вопрос задан
  • 89 просмотров
Пригласить эксперта
Ответы на вопрос 1
vilinyh
@vilinyh
60f0c1250aa16532179785.png

-- "справочник" хостов
create table tHosts (id int, name text);
insert into tHosts values(1,'Host 1');

-- "справочник" групп
create table tGroups (id int, name text);
insert into tGroups values(1, 'Group A'), (2, 'Group B'), (3, 'Group C');

-- история вхождения хостов в группы
create table tGroupsHistory (hostId int, groupId int, dt_start int, dt_end int);
insert into tGroupsHistory values(1, 1, 0, 1000), (1, 2, 1001, 2000), (1, 1, 2001, 3000), (1, 3, 500, 1500);

-- события хостов
create table tEvents (id int, name text, hostId int, dt_start int, dt_end int);
insert into tEvents values(1, 'Event Alpha', 1, 750, 1700);

-- отчет для событий
select
    e.name as "event name",
    e.dt_start as "event started",
    e.dt_end as "event ended",
    g.name as "group name",
    greatest(e.dt_start, gh.dt_start) as "responsibility started",
    least(e.dt_end, gh.dt_end) as "responsibility ended"
from tEvents e
join tGroupsHistory gh on e.hostId = gh.hostId
        -- вхождение подходит если событие попадает внутрь интервала
	and (e.dt_start between gh.dt_start and gh.dt_end or e.dt_end between gh.dt_start and gh.dt_end)
join tGroups g on gh.groupId = g.id
order by 3, 4, 2
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы