MS SQL Server - 在多个表之间存储多对多关系

时间:2016-02-22 15:49:51

标签: sql-server relationships

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

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

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
    ...
)

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

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: 我不是很熟练,所以我不确定,如果这是我能得到的最好的模特。 是否有人对如何存储此类数据有其他或更好的了解?

接下来,我有测量数据表,例如:

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

E.g。主机“host123”上的服务“ping”在具有特定id_day的当天可用于90%。 但是,有必要对监视表中的每一行说明在该特定日期该主机的主机组以及当天该服务的哪些服务组(如果在任何一个中)。

问题2: 对我来说,它们是非常奇怪的关系,我无法弄清楚如何将它们存储到数据库中,所以例如从现在起两年后,我将能够为每张桌子上的每个记录说出来。有人知道我的问题的解决方案吗?我真的很感激。

提前谢谢。

1 个答案:

答案 0 :(得分:0)

1:没有更好的模型。创建关系表是模拟多对多关系的正确方法,例如你。

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

2:如果我理解你的问题,处理这个问题的方法是在你的关系表中放入开始日期和结束日期。因此,随着关系的变化,你可以回顾历史,看看某一天存在什么样的关系。