CMDB资产管理系统的数据表设计

时间:2022-08-17 20:41:37
Server表:
asset = models.OneToOneField( 'Asset')
主机名(hostname)
sn号(sn)
制造商(manufacture)
系统(os_platform)
系统版本(os_version)
CPU个数(cpu_count)
CPU版本(cpu_model)
创建的时间(ctime)
 
Disk表:
插槽位(slot)
磁盘型号(model)
磁盘容量(capacity)
磁盘类型(pd_type)
对server的外键(server_obj)
 
Nic(网卡信息)表:
网卡名称(nic_name)
mac地址(hwaddr)
子网掩码(netmask)
ip地址(ipaddr)
对server的外键(server_obj)
 
Memory(内存)表:
插槽位(slot)
型号(model)
容量(capacity)
内存sn号(sn)
对server的外键(server_obj)

server表除了上述的信息之外,我们是不是还得增加一下,这个server是放置在哪个机柜的哪一层上,因此我们需要给server表增加如下的两个字段

1
2
cabinet_num (机柜号)
cabinet_order(机柜中序号)

那此时又来一个问题,上面只是我们采集的server的信息,那如果我们还要采集交换机,路由器的信息呢?我们是不是还得搞一张网络设备的表吧,结构如下:

1
2
3
4
5
6
7
NetWorkDevice表:
asset = models.OneToOneField( 'Asset')
management_ip (管理IP)
vlan_ip (VlanIP)
intranet_ip (内网IP)
sn (SN号)
manufacture (制造商)

那此时,又出现了和上面server表一样的问题,是不是还得加上这个设备放置在哪个机柜的哪一层上,因此我们是不是又得给NetWorkDevice表增加如下的两个字段

1
2
cabinet_num (机柜号)
cabinet_order(机柜中序号)

如此这般,我们思考一下,我们能不能把这些相同的属性抽离出来呢,在搞成一张单独的表,并和上面的server表和NetWorkDevice表做一个一对一的关联

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Asset表:
device_type_choices = (
( 1, '服务器'),
( 2, '交换机'),
( 3, '防火墙'),
)
device_status_choices = (
( 1, '上架'),
( 2, '在线'),
( 3, '离线'),
( 4, '下架'),
)
 
device_type_id = models.IntegerField(choices=device_type_choices, default= 1)
device_status_id = models.IntegerField(choices=device_status_choices, default= 1)
 
cabinet_num = models.CharField( '机柜号', max_length=30, null=True, blank=True)
cabinet_order = models.CharField( '机柜中序号', max_length=30, null=True, blank=True)
 
idc = models.ForeignKey( 'IDC', verbose_name='IDC机房', null=True, blank=True)
product_line = models.ForeignKey( 'ProductLine', verbose_name='属于的业务线', null=True, blank=True)
 
create_at = models.DateTimeField(auto_now_add= True)

接下来我们在思考,我们的服务器或者说其他的网络设备,是不是应该分配给我们的产品线使用,因此,我们是不是需要一个产品线表

1
2
3
4
5
6
7
8
9
10
11
 
ProductLine:
 
name = models.CharField( '业务线', max_length=64, unique=True)
 
contact = models.ForeignKey( 'UserGroup', verbose_name='业务联系人', related_name='c')
manager = models.ForeignKey( 'UserGroup', verbose_name='系统管理员', related_name='m')
 
IDC:
name = models.CharField( '机房', max_length=32)
floor = models.IntegerField( '楼层', default=1)

接下来,就是该考虑一下这个业务线是不是应该有个管理员或者说业务线的联系人,这样的话,出了事情我们可以联系到

1
2
3
4
5
6
7
8
 
UserProfile:
 
name = models.CharField( u'姓名', max_length=32)
email = models.EmailField( u'邮箱')
phone = models.CharField( u'座机', max_length=32)
mobile = models.CharField( u'手机', max_length=32)
password = models.CharField( u'密码', max_length=64)

按道理来说,我们的业务线应该关联的是我们的UserProfile表,但是由于我们需要有一个备选的人员,因此我们还需要一个组,以后我们的业务线只需要关联组就OK了

1
2
3
4
5
 
UserGroup:
 
name = models.CharField(max_length= 32, unique=True)
users = models.ManyToManyField( 'UserProfile')

除了上述的几张表之外,我们还需要如下的表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class AssetRecord(models.Model):
"""
资产变更记录,creator为空时,表示是资产汇报的数据。
"""
asset_obj = models.ForeignKey( 'Asset', related_name='ar')
content = models.TextField(null= True)# 新增硬盘
creator = models.ForeignKey( 'UserProfile', null=True, blank=True) #
create_at = models.DateTimeField(auto_now_add= True)
 
 
class Meta:
verbose_name_plural =  "资产记录表"
 
 
class ErrorLog(models.Model):
"""
错误日志,如:agent采集数据错误 或 运行错误
"""
asset_obj = models.ForeignKey( 'Asset', null=True, blank=True)
title = models.CharField(max_length= 16)
content = models.TextField()
create_at = models.DateTimeField(auto_now_add= True)
 
class Meta:
verbose_name_plural =  "错误日志表"