【问题标题】:Database model to describe IT environment [closed]描述 IT 环境的数据库模型
【发布时间】:2013-01-27 13:27:38
【问题描述】:

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

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

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

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

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

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

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

郑重声明,此应用不需要进行太多扩展(最多 1000 台设备),因此大规模的可扩展性并不是一个大问题。

【问题讨论】:

  • 感谢大家的回答,看起来 EAV 式 mdel 是一个合理的解决方案。我没有想到的另一件事是,在代码中表示这些设备的最佳方式是什么?为每种设备类型创建一个对象,并为其存储每个属性的字典(例如,san_array_1_size、san_array2_size 等)是一种合理的方法吗?

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


【解决方案1】:

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

class ITEntity(Model):
    name = CharField()

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

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

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

【讨论】:

    【解决方案2】:

    如果您对您发布的图片内容更满意,下面是稍作修改的版本(抱歉我无法上传图片,没有足够的代表)。

    +-------------+
    | 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。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 我对此进行了调查,虽然 Django 似乎有第三方支持 MongoDB,但我认为这有点超出我的技能水平,因为我对编程还很陌生。不过,绝对是我将来会研究的东西。
      猜你喜欢
      • 1970-01-01
      • 2012-10-16
      • 1970-01-01
      • 2016-07-21
      • 1970-01-01
      • 1970-01-01
      • 2016-09-11
      • 2021-11-05
      • 1970-01-01
      相关资源
      最近更新 更多