用于描述IT环境的数据库模型

时间:2013-01-27 13:27:38

标签: sql database django database-design django-models

我正在考虑编写一个Django应用程序来帮助记录相当小的IT环境。我不知道如何最好地建模数据,因为每个设备的属性数量可能会有所不同,即使在相同类型的设备之间也是如此。例如,SAN将具有一个或多个阵列,以及一个或多个卷。然后,阵列将具有名称,RAID级别,大小,磁盘数量的属性,并且卷将具有“大小”和“名称”的属性。不同的SAN将具有不同数量的阵列和卷。

对于服务器也是如此,每个服务器可以具有不同数量的磁盘/分区,所有这些磁盘/分区都具有大小,已用空间等属性,并且这将在服务器之间变化。

另一种设备类型可能是交换机,它不具有阵列或卷,但将具有多个网络端口,其中一些可能是千兆位,另一些是10/100,其他是10千兆位等。

此外,我希望将来能够在不更改模型的情况下添加设备类型。新设备类型可以是电话系统,其将具有其自己的独特属性,这些属性可以在不同电话系统之间变化。

我已经研究过EAV数据库设计,但它看起来很快变得非常复杂,而且我不清楚它是否是最好的解决方法。我正在思考模型中的某些内容,如图所示。

http://i.stack.imgur.com/ZMnNl.jpg

奖励是能够在特定时间创建环境的“快照”,从而可以随时查看环境变化。将日期列添加到属性表可能是解决此问题的方法。

为了记录,这个应用程序不需要扩展太多(最多1000个设备),因此大规模的可扩展性不是一个大问题。

3 个答案:

答案 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。