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. golang 强制重新全部编译

    /home/用户名/.cache 删除缓存试试?? 修改的东西老失败 编译结果总不变 神奇了 go build -a    -x -v加一句-a 强制重新编译.

  2. 拼凑json的实例

    一,拼凑  json 串 并传到后台 function writeToJson(num){ var i = 1; var jsonData = "["; for(i=1;i< ...

  3. classList属性和className的区别

    className的不方便之处: 在操作类名时,需要通过className属性添加,删除和替换类名.因为className中是一个字符串,所以即使只修改字符串一部分,也必须每次都设置整个字符串的值.( ...

  4. 【贪心 堆】luoguP2672 推销员

    堆维护,贪心做法 题目描述 阿明是一名推销员,他奉命到螺丝街推销他们公司的产品.螺丝街是一条死胡同,出口与入口是同一个,街道的一侧是围墙,另一侧是住户.螺丝街一共有N家住户,第i家住户到入口的距离为S ...

  5. GIMP永久保存选择的办法

    选择选区,然后把选区放到channel里面去 这是一张已经选择好的选区的图片 然后选择select下的Save to Channel, 需要这部分选区的话,只需要点击这个按钮就可以了

  6. python基础——9(迭代器、生成器)

    一.迭代器 1.概念 器:包含了多个值的容器 迭代:循环反馈(一次从容器中取出一个值) 迭代器:从装有多个值的容器中一次取出一个值给外界 s = 'abcdef' ls = [1,2,3,4,5] 遍 ...

  7. ORACLE 查询所有用户调度作业

    --查询所有用户调度作业:select * from ALL_SCHEDULER_JOBS; --查询当前用户调度作业:select * from USER_SCHEDULER_JOBS; --查询当 ...

  8. 【10】css hack原理及常用hack

    [10]css hack原理及常用hack 原理:利用不同浏览器对CSS的支持和解析结果不一样编写针对特定浏览器样式.常见的hack有1)属性hack.2)选择器hack.3)IE条件注释 IE条件注 ...

  9. idea 无法创建Scala class 选项解决办法汇总

    原因一:没有添加scala sdk 解决:file=>project structure =>Global Libraries,添加scala-sdk: 没有scala sdk的可以去网上 ...

  10. A. Nearest Common Ancestors

    A. Nearest Common Ancestors Time Limit: 1000ms Case Time Limit: 1000ms Memory Limit: 10000KB   64-bi ...