私は、より大きなシステムの基盤として使用されるグループ階層のデータベース設計に取り組んでいます。各グループには、他のグループと、リーフ オブジェクトとして「デバイス」を含めることができます (デバイスの下には何もありません)。
使用されているデータベースは MS SQL 2005 です。
グループにはさまざまな種類があり、これらは動的であり、ユーザーが実行時に定義できる必要があります。たとえば、グループ タイプは「顧客」、「アカウント」、「都市」、または「建物」、「フロア」であり、各タイプには、ユーザーが定義できる異なる属性セットがあります。ビジネス ルールも適用されます。たとえば、「フロア」は「ビルディング」グループの下にのみ含めることができ、これらは実行時に定義できます。
アプリケーション機能の多くは、これらのグループに基づいてレポートを実行することで得られるため、特定のグループ (およびすべてのサブグループ) に含まれるすべてのデバイスのリストを比較的高速に取得する方法が必要です。
変更された事前注文ツリー トラバーサル手法を使用してグループを格納することには、高速であるという利点がありますが、かなり複雑で壊れやすいという欠点があります。外部ユーザー/アプリケーションがデータベースを変更すると、完全に破損する可能性があります。また、ORM レイヤーも実装していますが、この方法では、ほとんどの ORM ライブラリでリレーションを使用するのが複雑になるようです。
共通のテーブル式と「標準の」id/parentid グループの関係を使用することは、複数の再帰クエリの実行を回避するための強力な方法のようです。この方法に欠点はありますか?
属性に関する限り、それらを保存する最良の方法は何ですか? グループに関連する細長いテーブル? 「名前」などの一般的な属性は、属性テーブルではなく、グループ テーブルに格納する必要がありますか (多くの場合、表示に必要なのは名前だけです)。
この方法を使用すると、パフォーマンスの問題が発生しますか (クアッドコア Xeon 2 Ghz、4GB RAM などの適切なハードウェア上で、それぞれ平均 6 つの属性を持つ平均 2000 のグループと、平均 10 人の同時ユーザーを想定します)。 、他のプロセスを割り引いて)?
ここで概説したものとはまったく異なるスキーマを自由に提案してください。気になる問題点をまとめてみました。