0

動的に作成された階層的な部門構造を保存および取得するためのデータベースを開発しようとしています。各部門は、子部門のセットまたは子属性のセットを持つことができますが、両方を持つことはできません。実行時に、ユーザーは部門と部門の子を作成します。部門が子として属性を持つ場合、ユーザーは各属性のタイプ (int/string/bool)、サイズを指定します。ユーザーは、部門の子として任意の数の属性を指定できます。したがって、部門構造は次のようになります。

RootDep
   Dep1
   Dep2
     attribute1(string,12)
     attribute2(int,10)
   Dep3
     Dep31
     Dep32
        Dep321
   Dep4
     Dep41
        attribute4(bool,size not applicable)
        attribute5(string,60)
        attribute6(string,10)
        attribute19(int, 5)   
     Dep5   

この階層構造をデータベースに保存する必要があります。その後、ユーザーは、子として属性を持つ部門 Dep2 および Dep41 のデータを追加することもできます。したがって、ユーザーがそのような部門に属性を追加したときに、部門のテーブルを動的に生成する必要があると思います。

ユーザーは、構造を変更することもできます。例: 新しい部門/属性の追加、部門/属性の削除、部門名の変更、属性名の変更。ユーザーは、子として属性を持つ部門に入力されたレコードを変更することもできます。

この目的のためにデータベースを設計する最良の方法を教えてください。

4

2 に答える 2

0

子部門が属性のない親にのみ接続でき、属性が子のない部門にのみ接続できるようにするには、次のようにすることができます...

ここに画像の説明を入力

DEPARTMENT 表に次の制約を指定します。

CHECK (
    (PARENT_TYPE IS NULL AND PARENT_NO IS NULL)
    OR (PARENT_TYPE IS NOT NULL AND PARENT_NO IS NOT NULL AND PARENT_TYPE = 1)
)

ATTRIBUTE テーブルに対する次の制約:

CHECK (DEPARTMENT_TYPE = 2)

部門が属性を持つには、(2 番目の CHECK に違反しないように) タイプ 2 でなければならないため、子部門を持つことはできません (最初の CHECK に違反するため)。

部門が子部門を持つには、タイプ 1 でなければなりません (最初の CHECK に違反しないようにするため)。これにより、属性を持つことも禁止されます (2 番目の CHECK に違反するため)。

無子無属性の部門は、タイプ 1 またはタイプ 2 のいずれかになります。


もう 1 つの問題は、属性値を格納する方法です。

  1. 1 つの方法は、常に文字列としてエンコードし、「元の」型を一緒に格納することです。

    ここに画像の説明を入力

  2. または、使用可能なタイプごとに個別のフィールドを作成し、そのうちの 1 つだけが非 NULL であることを確認する CHECK を使用できます。

    ここに画像の説明を入力

  3. または、完全に行き過ぎて、属性タイプごとに個別のテーブルを使用します。

(1)または(2)に固執するのが最善だと思います。

于 2012-09-14T15:19:12.850 に答える
0

このためにテーブルを動的に生成することはお勧めしません。部門用と属性用の 2 つのテーブルでそれを行うことができます。

create table dept (
    dept_id int,
    parent_dept_id int null,
)

create table dept_attribute (
    dept_id int,
    attribute_id int,
    value_type int,
    value_length int,
    int_value int null,
    string_value varchar(255) null,
    boolean bit
)
于 2012-09-14T03:32:13.250 に答える