MS SQL 服务器 - 存储多个表之间的多对多关系

MS SQL Server - storing many-to-many relations between several tables

我有监控软件可以检查某些主机上某些服务的可用性。主机可以包含在多个主机组中,服务也可以包含在多个服务组中。

我有这些 tables 来存储实际值和历史值(不再存在的主机和服务)值:

CREATE TABLE hosts (
    id_host int
    name
    ...
)

CREATE TABLE service (
    id_service int
    name
    ...
)

CREATE TABLE hostgroups (
    id_hostgroup int,
    name
    ...
)

CREATE TABLE servicegroups (
    id_servicegroup int,
    name
    ...
)

然后,我从许多来源了解到,多对多关系的最佳解决方案是创建关系 tables。所以我决定为实际存在的关系创建关系 tables,如下所示:

CREATE TABLE host_service (
    id_host int,
    id_service int
)

CREATE TABLE host_hostgroup (
    id_host int,
    id_hostgroup int
)

CREATE TABLE host_service_servicegroup (
    id_host int,
    id_service int,
    id_servicegroup int
)

问题 1: 我不是很熟练,所以我不确定这是否是我可以获得的最佳模型。 有人对如何存储此类数据有其他或更好的想法吗?

接下来我有table有实测数据,如:

CREATE TABLE monitoring (
    id_monitoring int,
    id_day int,
    id_host int,
    id_service int,
    value float
    ...
)

例如主机 "host123" 上的服务 "ping" 在特定日期 id_day 可用 90%。 但是,有必要在监视 table 中为每一行说明该主机在该特定日期的主机组以及该服务在该日期的服务组(如果有的话)中的每一行。

问题二: 对我来说,它们是非常奇怪的关系,我不知道如何将它们存储到数据库中,例如两年后,我将能够说出此 table 中每条记录的每个组。有人知道我的问题的解决方案吗?我真的很感激。

提前谢谢你。

1:没有更好的模型。创建关系 tables 是对多对多关系建模的正确方法,例如您所拥有的。

也就是说,我认为您不需要 host_service table。您可以在 host_service_servicegroup table 中找到主机和服务之间的关系。尽量避免建立比您需要更多的关系 table。

2:如果我理解你的问题,处理这个问题的方法是在你的关系 table 中输入开始和结束日期。这样随着关系随着时间的推移而变化,您可以回顾历史并查看某一天存在哪些关系。