我正在考虑编写一个Django应用程序来帮助记录相当小的IT环境。我不知道如何最好地建模数据,因为每个设备的属性数量可能会有所不同,即使在相同类型的设备之间也是如此。例如,SAN将具有一个或多个阵列,以及一个或多个卷。然后,阵列将具有名称,RAID级别,大小,磁盘数量的属性,并且卷将具有“大小”和“名称”的属性。不同的SAN将具有不同数量的阵列和卷。
对于服务器也是如此,每个服务器可以具有不同数量的磁盘/分区,所有这些磁盘/分区都具有大小,已用空间等属性,并且这将在服务器之间变化。
另一种设备类型可能是交换机,它不具有阵列或卷,但将具有多个网络端口,其中一些可能是千兆位,另一些是10/100,其他是10千兆位等。
此外,我希望将来能够在不更改模型的情况下添加设备类型。新设备类型可以是电话系统,其将具有其自己的独特属性,这些属性可以在不同电话系统之间变化。
我已经研究过EAV数据库设计,但它看起来很快变得非常复杂,而且我不清楚它是否是最好的解决方法。我正在思考模型中的某些内容,如图所示。
http://i.stack.imgur.com/ZMnNl.jpg
奖励是能够在特定时间创建环境的“快照”,从而可以随时查看环境变化。将日期列添加到属性表可能是解决此问题的方法。
为了记录,这个应用程序不需要扩展太多(最多1000个设备),因此大规模的可扩展性不是一个大问题。
答案 0 :(得分:1)
由于您的属性是每个模型实例,并且每个实例都不同, 我建议使用完全免费的架构
class ITEntity(Model):
name = CharField()
class ITAttribute(Modle)
name = CharField()
value = CharField()
entity = ForeignKey(ITEntity, related_name="attrs")
这是一个非常简单的模型,您可以在应用程序代码中完成其余工作,例如模板(即切换模板,路由器模板等) - 它更加直接,然后使用像EAV这样的复杂模型(我喜欢EAV,但这似乎不是用法的用法。)
添加历史记录也很简单 - 只需将时间戳添加到ITAttribute
即可。更改属性时 - 改为创建新属性。然后获取属性选择具有最新时间戳的属性。这样,您始终可以获得环境的时间点视图。
答案 1 :(得分:0)
您可以尝试使用基于NoSQL数据库的文档,例如MongoDB。每个文档都可以表示具有任意数量的不同字段的设备。
答案 2 :(得分:0)
如果您对所发布图像的某些内容感到更舒服,则下面是稍微修改过的版本(抱歉,我无法上传图片,没有足够的代表)。
+-------------+
| Device Type |
|-------------|
| type |--------+
+-------------+ |
^
+---------------+ +--------------------+ +-----------+
| Device |----<| DeviceAttributeMap |>----| Attribute |
|---------------| |--------------------| |-----------|
| name | | Device | | name |
| DeviceType | | Attribute | +-----------+
| parent_device | | value |
| Site | +--------------------+
+---------------+
v
+-------------+ |
| Site | |
|-------------| |
| location |--------+
+-------------+
我添加了一个链接表DeviceAttributeMap
,因此您可以更好地控制Attribute
目录,从而允许查询具有相同Attribute
但不同值的设备。我还在名为parent_device
的设备模型中添加了一个字段,用作捕获设备父设备之间关系的自引用外键。您可能希望将此字段设为可选字段。要使Django中的外键parent_device
可选,请将字段的null和blank属性设置为True。