3

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

服务器也是如此,每台服务器可能有不同数量的磁盘/分区,所有这些都将具有大小、已用空间等属性,这在服务器之间会有所不同。

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

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

我研究过 EAV 数据库设计,但它似乎很快就变得非常复杂,我不清楚这是否是解决这个问题的最佳方法。如图所示,我正在考虑模型的一些内容。

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

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

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

4

3 回答 3

1

由于您的属性是每个模型实例并且每个实例都不同,我建议使用完全免费的模式

class ITEntity(Model):
    name = CharField()

class ITAttribute(Modle)
    name = CharField()
    value = CharField()
    entity = ForeignKey(ITEntity, related_name="attrs")

这是一个非常简单的模型,您可以完成其余的工作,例如应用程序代码中的模板(即交换机模板、路由器模板等)——它比使用像 EAV 之类的复杂模型更直接(我喜欢 EAV,但这确实似乎不是这个的用例)。

添加历史记录也很简单 - 只需将时间戳添加到ITAttribute. 更改属性时 - 改为创建新属性。然后获取属性选择具有最新时间戳的属性。这样您就可以随时查看您的环境。

于 2013-01-27T13:36:42.570 回答
0

您可以尝试使用基于文档的 NoSQL 数据库,例如 MongoDB。每个文档都可以表示具有任意多个不同字段的设备。

于 2013-01-27T13:31:21.173 回答
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 和空白属性设置为 True。

于 2013-01-27T23:48:23.913 回答