针对(可疑)多对多关系的模式设计

时间:2012-02-09 10:03:02

标签: database database-design

我正在创建一个用于跟踪网络上计算机配置的应用程序。 “配置”广义地定义了系统上安装的产品/服务/ OS /应用程序。其中任何一个的变化都会导致配置发生变化。 使用扫描仪获取信息。数据已经过解析。我需要找到一种有效存储数据的方法。

基本理念是

  1. 每个IP都有一个配置标识符以及时间戳信息和标识数据为当前或历史的标志
  2. 每个配置轮流由多种类型的条目组成。因此,对于每个配置标识符,我们最多有三种类型的条目(1-OS,2-Service,3- Applications)
  3. 每种类型的条目都可以有多个条目。例如,类型1(即 - OS)可以有多个类型的条目a)Microsoft Windows XP b)Microsoft Windows 7等。
  4. 我坚持定义一组合适的表来帮助我实现以下目标

    1. 了解每个IP的操作系统/服务。应用程序信息
    2. 识别IP配置中的更改/不更改/恢复
    3. 我得到的数据是IP和条目集及其类型标识符。例如。

      IP - x.y.z.w : 
      Entries - Microsoft Windows XP :1(Type-OS), 
                Apache HTTP 2.3 :2(Type-Service),
                Mozilla Firefox :3(Type - Application) 
      

      早些时候,当我没有对配置感到困扰,只是必须存储条目我有以下方案

      Table ip_map : id int, ip char #Table that keeps track of IPs
      Table ip_ref: id int , ip_id references ip_map(id), t_stamp timestamp, archived bool, type smallint  #Table that keeps IPs and type
      Table current_network: id int, ip_ref_id references ip_ref(id), port int, vendor, product,version  #Table that stores actual entries
      

      即。 - 我使用IP和类型信息识别了条目。

      如果我需要实现配置,该方案应该有点像

      ip_map:
      +--+-------+
      |id|ip     |
      +--+-------+
      |1 |x.y.z.w|
      +--+-------+
      
      ip_config:
      +--+------+----------+--------+----------+
      |id|ip_id |t_stamp   |archived|config_num|
      +--+------+----------+--------+----------+
      |1 |1     |1212231313|    1   |    1     |
      |2 |1     |1212299999|    0   |    2     |
      +--+------+----------+--------+----------+
      

      在此之后,我陷入困境。理想情况下,config_num是指向配置表主键的外键。但由于配置由不同类型组成,因此似乎不可能。这就是我的想法。

      config:
      +--+---+----+
      |id|num|type|
      +--+---+----+
      |1 | 1 | 1  |
      |2 | 1 | 2  |
      |3 | 2 | 1  |
      |4 | 2 | 2  |
      +--+---+----+
      
      entry:
      +--+---------+----+-------------+-------------+-------------+
      |id|config_id|port|vendor       | product     | version     |
      +--+---------+----+-------------+-------------+-------------+
      |1 | 1       | 0  | Microsoft   | Windows     | XP          |
      |2 | 1       | 0  | Microsoft   | Windows     | 7 Home      |
      |3 | 2       | 80 | Apache      | HTTP Server | 2.3.19      |
      |4 | 3       | 0  | Linux       | Linux       | 2.6         |
      |5 | 3       | 0  | Linux       | Linux       | 2.4         |
      |6 | 4       | 22 | OpenSSH     | SSHD        | 4.3p1       |
      +--+---------+----+-------------+-------------+-------------+
      

      但它破坏了一致性(由于缺少ip_config和config表之间的外键)。 IP可能会被删除,但配置将继续存在。 如何改变设计以适应我的要求?

      注意:理想情况下,应该单独维护类型信息(对于每个IP或配置),因为这是程序的一个单独部分所期望的。

1 个答案:

答案 0 :(得分:1)

我不能说我理解这里的一切,所以这个例子可能会给你一些想法。

ConfigurationType开始,可以是1- OS; 2- Service ...

Configuration表包含所有可能(允许)的配置。 ConfigurationTypeNo是每个ConfigurationTypeID的整数(1,2,3 ...) - 所以有OS(1,2,3 ..);服务(1,2,3 ......)等。

SystemConfiguration捕获每个系统的配置设置历史记录。如果TimeChanged是PK的一部分,则可以重复相同的配置。

IP_Allocation跟踪IP分配的历史记录。

enter image description here