2012-02-09 64 views
2

我正在创建一个跟踪网络上计算机配置的应用程序。 “配置”广泛地定义了系统上安装的产品/服务/操作系统/应用程序。任何一个变化都会导致配置发生变化。 使用扫描仪获取信息。数据已被解析。我需要找出一种有效存储数据的方法。(疑似)多对多关系的架构设计

的基本思想是

  1. 每个IP将有一个配置标识符具有时间戳信息和标识该数据作为当前或历史
  2. 在打开各配置由多种类型的条目的标志位。因此,对于每个配置标识符,我们最多有三种类型的条目(1-OS,2-Service,3-应用程序)
  3. 每种类型的条目可以有多个条目。例如类型1(即-OS)可以具有多种类型的条目a)Microsoft Windows XP b)Microsoft Windows 7等

我被困在定义一组合适的表格,可以帮助我履行以下目标

  1. 去了解每个IP
  2. 识别更改的OS/Service.Application信息/没有改变/在IP

的数据,我得到的配置恢复为IP和SE t条目及其类型标识符。例如。

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和配置表之间的外键)。 IP可能会被删除,但配置将继续存在。 如何改变设计以适应我的要求?

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

回答

1

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

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

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

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

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

enter image description here

+0

这是一个不错的选择。但我试图避免复合主键(Django不完全支持它们)。所以我认为这 - ip_config可以有一个config_id,然后我们创建一个新的表配置只有id字段。另一个表config_type_map描述config_id和type_id之间的多对多关系,并且它自己的id被用作描述条目的表的外键 – RedBaron 2012-02-10 05:56:16

+0

避免复合键的一种方法(因为ORM给你带来麻烦)是使用auto -Increment-integers,然后简单地为数据库表添加唯一约束 - 例如,您可以将'SystemConfigurationID'作为PK添加到'SystemConfigurationTable'中,然后在'(SystemID,ConfigurationTypeID,ConfigurationTypeNo,TimeChanged) 。这会创建一个额外的索引,但允许选定的ORM的好处。 – 2012-02-10 13:03:33