3

かなり小さなIT環境の文書化に役立つDjangoアプリの作成を検討しています。同じタイプのデバイス間でも、デバイスごとの属性の数が異なる可能性があるため、データをモデル化するのに最適な方法に行き詰まっています。たとえば、SANには1つ以上のアレイと1つ以上のボリュームがあります。アレイには名前、RAIDレベル、サイズ、ディスク数の属性があり、ボリュームにはサイズと名前の属性があります。SANが異なれば、アレイとボリュームの数も異なります。

サーバーについても同じことが言えます。各サーバーには異なる数のディスク/パーティションがあり、そのすべてにサイズ、使用済みスペースなどの属性があり、これはサーバーによって異なります。

別のデバイスタイプは、アレイやボリュームを持たないスイッチですが、いくつかのネットワークポートがあり、その一部はギガビット、その他は10/100、その他は10ギガビットなどです。

さらに、将来的にはモデルを変更せずにデバイスタイプを追加できるようにしたいと思います。新しいデバイスタイプは電話システムである場合があり、電話システムごとに異なる独自の属性があります。

私は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

MongoDBのようなドキュメントベースのNoSQLデータベースを試すことができます。各ドキュメントは、必要な数の異なるフィールドを持つデバイスを表すことができます。

于 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属性とblank属性をTrueに設定します。

于 2013-01-27T23:48:23.913 に答える