我正在创建一个跟踪网络上计算机配置的应用程序。 “配置”广泛地定义了系统上安装的产品/服务/操作系统/应用程序。任何一个变化都会导致配置发生变化。 使用扫描仪获取信息。数据已被解析。我需要找出一种有效存储数据的方法。(疑似)多对多关系的架构设计
的基本思想是
- 每个IP将有一个配置标识符具有时间戳信息和标识该数据作为当前或历史
- 在打开各配置由多种类型的条目的标志位。因此,对于每个配置标识符,我们最多有三种类型的条目(1-OS,2-Service,3-应用程序)
- 每种类型的条目可以有多个条目。例如类型1(即-OS)可以具有多种类型的条目a)Microsoft Windows XP b)Microsoft Windows 7等
我被困在定义一组合适的表格,可以帮助我履行以下目标
- 去了解每个IP
- 识别更改的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或配置)理想情况下应单独维护,因为这是程序的一个单独部分预期它的方式。
这是一个不错的选择。但我试图避免复合主键(Django不完全支持它们)。所以我认为这 - ip_config可以有一个config_id,然后我们创建一个新的表配置只有id字段。另一个表config_type_map描述config_id和type_id之间的多对多关系,并且它自己的id被用作描述条目的表的外键 – RedBaron 2012-02-10 05:56:16
避免复合键的一种方法(因为ORM给你带来麻烦)是使用auto -Increment-integers,然后简单地为数据库表添加唯一约束 - 例如,您可以将'SystemConfigurationID'作为PK添加到'SystemConfigurationTable'中,然后在'(SystemID,ConfigurationTypeID,ConfigurationTypeNo,TimeChanged) 。这会创建一个额外的索引,但允许选定的ORM的好处。 – 2012-02-10 13:03:33