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

我不建议为此动态生成表。你可以用两张表来做——一张用于部门,一张用于属性:

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 回答
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),因此它不能有子部门(因为这会违反第一个 CHECK)。

对于具有子部门的部门,它必须是类型 1(以避免违反第一个 CHECK),这也禁止它具有任何属性(因为这会违反第二个 CHECK)。

无子无属性的部门可以是类型 1 或类型 2。


另一个问题是如何存储属性值。

  1. 一种方法是始终将其编码为字符串并将“原始”类型存储在其旁边:

    在此处输入图像描述

  2. 或者,您可以为每种可用类型设置一个单独的字段,并使用 CHECK 确保其中一个是非 NULL:

    在此处输入图像描述

  3. 或者完全过火并为每种属性类型使用单独的表。

我认为您最好坚持使用(1)或(2)。

于 2012-09-14T15:19:12.850 回答