【问题标题】:Database design for hierarchical department structure分层部门结构的数据库设计
【发布时间】:2012-09-14 23:19:12
【问题描述】:

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

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

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

【问题讨论】:

  • 在传统建模中,添加新部门就是添加新数据 (DML)。添加新属性就是添加新数据定义 (DDL)。如果您想要用户生成的属性,那么您将走向 EAV 设计。但是,请注意:如果每个用户基本上都可以构建自己的数据模型,那么以集成方式使用数据几乎是不可能的。

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


【解决方案1】:

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

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
)

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2020-11-14
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-17
      • 1970-01-01
      相关资源
      最近更新 更多