繁体   English   中英

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

[英]Database design for hierarchical department structure

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

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

请让我知道为此目的设计数据库的最佳方法。

我不建议为此动态生成表。 您可以使用两个表来完成此操作-一个用于部门,一个用于属性:

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
)

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

在此处输入图片说明

在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)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM