[英]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型。
另一个问题是如何存储属性值。
一种方法是始终将其编码为字符串,并在其旁边存储“原始”类型:
或者,您可以为每个可用的类型有一个单独的字段,并使用CHECK来确保其中一个恰好是非NULL:
或者完全落伍,为每种属性类型使用单独的表。
我认为您最好坚持(1)或(2)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.