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 = "错误日志表"

CMDB资产管理系统的数据表设计的更多相关文章

  1. SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 后端篇(五): 数据表设计、使用 jwt、redis、sms 工具类完善注册登录逻辑

    (1) 相关博文地址: SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 前端篇(一):搭建基本环境:https://www.cnblogs.com/l-y-h/p ...

  2. Python之CMDB资产管理系统

    最近正好在给公司做CMDB资产管理系统,现在做的也差不多了,现在回头吧思路整理下. CMDB介绍 CMDB --Configuration Management Database 配置管理数据库, C ...

  3. 【原创】C#搭建足球赛事资料库与预测平台(6) 赔率数据表设计2

            本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源C#彩票数据资料库系列文章总目录:[目录]C#搭建足球赛事资料库与预测平台与彩票数据分析目录 本篇文章开始将逐步介 ...

  4. 【原创】C#搭建足球赛事资料库与预测平台(3) 基础数据表设计

            本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html 开源C#彩票数据资料库系列文章总目录:http://www.cn ...

  5. 【原创】C#搭建足球赛事资料库与预测平台(4) 比赛信息数据表设计

            本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源C#彩票数据资料库系列文章总目录:[目录]C#搭建足球赛事资料库与预测平台与彩票数据分析目录 本篇文章开始将逐步介 ...

  6. PHP 开发 APP 接口 学习笔记与总结 - APP 接口实例 [5] 版本设计分析及数据表设计

    APP 版本升级以及 APP 演示 ① 版本升级分析以及数据表设计 ② 版本升级接口开发以及 APP 演示 /** * version_upgrade 版本升级信息表 */ CREATE TABLE ...

  7. mysql status关键字 数据表设计中慎重使用

    mysql status关键字  数据表设计中慎重使用

  8. 中小型WEB系统权限日志数据表设计

    中小型WEB系统权限日志数据表设计 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjc1MDU3OA==/font/5a6L5L2T/fontsi ...

  9. MySql数据表设计,索引优化,SQL优化,其他数据库

    MySql数据表设计,索引优化,SQL优化,其他数据库 1.数据表设计 1.1数据类型 1.2避免空值 1.3text类型优化 2.索引优化 2.1索引分类 2.2索引优化 3.SQL优化 3.1分批 ...

随机推荐

  1. postman使用--构建工作流和newman

    构建工作流 在使用“Collection Runner”的时候,集合中的请求执行顺序就是请求在Collection中的显示排列顺序.但是,有的时候我们不希望请求按照这样的方式去执行,可能是执行完第一个 ...

  2. 相机 感光度iso,焦距,光圈,ccd 和 噪点, 景深关系表格

    表格 矩阵 感官度iso: 越低曝光速度越慢,所谓慢工出细活,成像质量会好,如果形成的话. 但是因为慢,所以要更多的光量,才能画完. 就需要更慢的快门 (但是太慢手抖的话就糊掉,或者动的物体形成轨迹. ...

  3. UVa-101-木块问题

    这题用vector比较好写,我们设置对应的几个函数,然后进行相应的操作来简化代码,这样才不易出错. 对于输入和操作来说我们经分析之后,可以看到最后一个操作时最原始的操作也就是不需要还原任意一个堆任意高 ...

  4. 【NOIP2017提高A组冲刺11.8】购物

    这个范围对DP不友好,和CF的一道C题非常像,贪心+后悔. 先使用k个优惠券购买k个q最小的(钱不购买则退出),同时把这k个p[i]-q[i]放入小根堆,然后将剩下的n-k个按p升序排序,记小根堆堆顶 ...

  5. Day10文件内指针移动和函数

    强调:只有t模式下的read(n),n代表字符个数,除此以外都是以字节为单位 ,例如f.read(4)读出4个字符 控制文件内指针的移动:f.seek()以字节为单位 f.tell()文件开头为准,当 ...

  6. 内涵段子爬取及re匹配

    案例:使用正则表达式的爬虫 现在拥有了正则表达式这把神兵利器,我们就可以进行对爬取到的全部网页源代码进行筛选了. 下面我们一起尝试一下爬取内涵段子网站: http://www.neihan8.com/ ...

  7. 强制停止及删除(卸载)Windows服务

    1. 安装服务: CMD 打开命令行窗口:C:\> 运行:"C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe& ...

  8. RAISERROR 的用法(转)

    raiserror 的作用: raiserror 是用于抛出一个错误.[ 以下资料来源于sql server 2005的帮助 ]   其语法如下: RAISERROR ( { msg_id | msg ...

  9. RocketMQ VS kafka

    转自:https://github.com/alibaba/RocketMQ/wiki/rmq_vs_kafka 淘宝内部的交易系统使用了淘宝自主研发的Notify消息中间件,使用MySQL作为消息存 ...

  10. 源码分析 脱壳神器ZjDroid工作原理

    0. 神器ZjDroid Xposed框架的另外一个功能就是实现应用的简单脱壳,其实说是Xposed的作用其实也不是,主要是模块编写的好就可以了,主要是利用Xposed的牛逼Hook技术实现的,下面就 ...