分层部门结构的数据库设计

时间:2012-09-14 03:16:37

标签: mysql sql database sql-server-2008 database-design

我正在尝试开发一个数据库来存储和检索动态创建的分层部门结构。 每个部门都可以有一组子部门或一组子属性,但不能同时拥有这两个部门。 在运行时,用户创建一个部门和部门的子项。如果部门具有作为子项的属性,则用户指定类型(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添加数据。 因此,当用户为这样的部门添加属性时,我想我需要为部门动态生成表。

用户还可以修改结构。例如,添加新的部门/属性,删除部门/属性,重命名部门名称,属性名称。用户还可以修改为具有属性作为子项的任何部门输入的记录。

请告诉我为此目的设计数据库的最佳方式。

2 个答案:

答案 0 :(得分: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
)

答案 1 :(得分:0)

为确保子部门只能连接到无属性父级,并且属性只能连接到无子级部门,您可以执行以下操作...

enter image description here

在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. 一种方法是始终将其编码为字符串并将“原始”类型存储在其旁边:

    enter image description here

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

    enter image description here

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

  4. 我认为你最好坚持使用(1)或(2)。