Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 分层数据结构的建模 20120304-简化的问题_Database_Relational Database_Relationship - Fatal编程技术网

Database 分层数据结构的建模 20120304-简化的问题

Database 分层数据结构的建模 20120304-简化的问题,database,relational-database,relationship,Database,Relational Database,Relationship,假设我们有实体R,D和E,这个关系基数 RD DE 本规范的映射是直接的,但我们还有另一个要求: RE 侧条件:E1可能仅“分配”给R1,前提是E1与某些D1相关,而此D1与R1相关 不幸的是,即使E2与R2相关的D2相关,E2也可能与R2无关 我正在寻找一个关系数据库模型 如果一个D从Ra分离并重新连接到另一个Rb,则该模型不需要多次更新。在这种情况下,D的所有E都需要从Ra分离并连接到Rb 20120305-解决方案? 一位朋友建议创建一个实体DxR,它通过元组(D,R)链接其D

假设我们有实体R,D和E,这个关系基数

  • RD
  • D<1:n>E
本规范的映射是直接的,但我们还有另一个要求:

  • RE
侧条件:E1可能仅“分配”给R1,前提是E1与某些D1相关,而此D1与R1相关

不幸的是,即使E2与R2相关的D2相关,E2也可能与R2无关

  • 我正在寻找一个关系数据库模型
  • 如果一个D从Ra分离并重新连接到另一个Rb,则该模型不需要多次更新。在这种情况下,D的所有E都需要从Ra分离并连接到Rb
20120305-解决方案? 一位朋友建议创建一个实体DxR,它通过元组(D,R)链接其D和R。然后创建一个关系

  • DxRE

20120302-原始问题 系统由顶层区域(Z)组成。一个区域可能有几个区域(R)

所谓的部门(D)可以分配给区域。只有当每个区域属于不同的区域时,一个部门才能被分配到多个区域

最后,员工(E)属于一个且仅属于一个部门

只有当员工的部门属于某个区域时,才能将员工分配到该区域

重要提示:员工不必属于其部门所属的所有地区。

假设在以下图形中,E1属于D1。E1也应属于R1,但不属于R2-尽管D1属于R1和R2:

-     Z            Z
-   __|___      ___|___
-   R1   R      R2    R
-    \_________/
-     D1         

Q:请提出关系数据库的表结构,该表结构为上述规范建模?

从某种意义上讲,这个问题非常具体,有些人可能会认为它过于本地化。然而,有一个更普遍适用的想法可能对未来的其他人有用,因此问题不一定太具体

这些商业规则中真正有趣的部分是:(我的重点补充)

一个部门可能被分配到多个地区,但前提是每个地区 区域属于不同的区域

下面是一个模式,它以声明方式捕获几乎所有已声明的业务规则,而不必求助于任何触发器

create table ZONE
( ID int not null
, NAME varchar(50) not null
, constraint PK_ZONE primary key clustered (ID)
)

create table REGION
( ZONE_ID int not null
, REGION_ID int not null
, NAME varchar(50) not null
, constraint PK_REGION primary key clustered (ZONE_ID, REGION_ID)
, conttraint FK_REGION__ZONE foreign key (ZONE_ID) 
    references ZONE (ID)
)

create table DEPARTMENT
( ID int not null
, NAME varchar(50) not null
, constraint PK_DEPARTMENT primary key clustered (ID)
)

create table EMPLOYEE
( ID int not null
, NAME varchar(50) not null
, DEPT_ID int not null
, constraint PK_EMPLOYEE primary key clustered (ID)
, constraint FK_EMPLOYEE__DEPARTMENT foreign key (DEPT_ID) 
    references DEPARTMENT (ID)
)
上面的表格很明显。但是,有一个特殊的怪癖:
区域
表有一个复合主键,其中包括FK to
区域
。这有助于传播关于部门必须在区域内不同的约束

将部门分配给区域需要交叉表:

create table DEPT_ASGT -- Department Assignment
( REGION_ID int not null
, DEPT_ID int not null
, ZONE_ID int not null
, constraint PK_DEPT_ASGT (REGION_ID, DEPT_ID)
, constraint FK_DEPT_ASGT__REGION foreign key (ZONE_ID, REGION_ID) 
    references REGION (ZONE_ID, ID)
, constraint FK_DEPT_ASGT__DEPARTMENT foreign key (DEPT_ID) 
    references DEPARTMENT (ID)
, constraint UN_DEPT_ASGT__ZONES unique nonclustered (ZONE_ID, DEPT_ID)
)
create table EMP_ASGT -- Employee Assignment
( REGION_ID int not null
, DEPT_ID int not null
, EMPLOYEE_ID int not null
, constraint PK_EMP_ASGT (REGION_ID, DEPT_ID, EMPLOYEE_ID)
, constraint FK_EMP_ASGT__DEPT_ASGT (REGION_ID, DEPT_ID) 
    references DEPT_ASGT (REGION_ID, DEPT_ID)
, constraint FK_EMP_ASGT__EMPLOYEE (EMPLOYEE_ID) refernces EMPLOYEE (ID)
)
这个交集表非常正常,因为它链接的每个表都有一个外键。此相交表的特殊之处在于唯一约束。这就是为什么一个部门不能位于同一区域内的两个不同区域

最后,我们需要将员工划分为部门和区域。这需要另一个交集表:

create table DEPT_ASGT -- Department Assignment
( REGION_ID int not null
, DEPT_ID int not null
, ZONE_ID int not null
, constraint PK_DEPT_ASGT (REGION_ID, DEPT_ID)
, constraint FK_DEPT_ASGT__REGION foreign key (ZONE_ID, REGION_ID) 
    references REGION (ZONE_ID, ID)
, constraint FK_DEPT_ASGT__DEPARTMENT foreign key (DEPT_ID) 
    references DEPARTMENT (ID)
, constraint UN_DEPT_ASGT__ZONES unique nonclustered (ZONE_ID, DEPT_ID)
)
create table EMP_ASGT -- Employee Assignment
( REGION_ID int not null
, DEPT_ID int not null
, EMPLOYEE_ID int not null
, constraint PK_EMP_ASGT (REGION_ID, DEPT_ID, EMPLOYEE_ID)
, constraint FK_EMP_ASGT__DEPT_ASGT (REGION_ID, DEPT_ID) 
    references DEPT_ASGT (REGION_ID, DEPT_ID)
, constraint FK_EMP_ASGT__EMPLOYEE (EMPLOYEE_ID) refernces EMPLOYEE (ID)
)
您将注意到
EMPLOYEE
表中有一个指向
部门的外键,它强制执行每个员工只能属于一个部门的规则。
EMP\u ASGT
表添加了员工参与的区域的详细信息。由于员工可能不会参与其部门分配到的每个区域,因此
EMP\u ASGT
表将员工与他们参与的区域连接起来


这里是一个需要触发器或其他程序逻辑的地方。您需要确保EMPLOYEE.department\u id与EMP\u ASGT中的记录保持一致。您可以尝试通过将EMPLOYEE的PK设置为ID和DEPT_ID的复合,将其推进声明性引用完整性,但这将迫使您决定是否要违反3NF或使您的EMPLOYEE department更改在程序上变得一团糟。在一天结束时,确保EMP_ASGT不与EMPLOYEE.DEPT_ID不一致的一个小触发点将大大减少麻烦。

从某种意义上说,这个问题非常具体,有些人可能会认为它过于本地化。然而,有一个更普遍适用的想法可能对未来的其他人有用,因此问题不一定太具体

这些商业规则中真正有趣的部分是:(我的重点补充)

一个部门可能被分配到多个地区,但前提是每个地区 区域属于不同的区域

下面是一个模式,它以声明方式捕获几乎所有已声明的业务规则,而不必求助于任何触发器

create table ZONE
( ID int not null
, NAME varchar(50) not null
, constraint PK_ZONE primary key clustered (ID)
)

create table REGION
( ZONE_ID int not null
, REGION_ID int not null
, NAME varchar(50) not null
, constraint PK_REGION primary key clustered (ZONE_ID, REGION_ID)
, conttraint FK_REGION__ZONE foreign key (ZONE_ID) 
    references ZONE (ID)
)

create table DEPARTMENT
( ID int not null
, NAME varchar(50) not null
, constraint PK_DEPARTMENT primary key clustered (ID)
)

create table EMPLOYEE
( ID int not null
, NAME varchar(50) not null
, DEPT_ID int not null
, constraint PK_EMPLOYEE primary key clustered (ID)
, constraint FK_EMPLOYEE__DEPARTMENT foreign key (DEPT_ID) 
    references DEPARTMENT (ID)
)
上面的表格很明显。但是,有一个特殊的怪癖:
区域
表有一个复合主键,其中包括FK to
区域
。这有助于传播关于部门必须在区域内不同的约束

将部门分配给区域需要交叉表:

create table DEPT_ASGT -- Department Assignment
( REGION_ID int not null
, DEPT_ID int not null
, ZONE_ID int not null
, constraint PK_DEPT_ASGT (REGION_ID, DEPT_ID)
, constraint FK_DEPT_ASGT__REGION foreign key (ZONE_ID, REGION_ID) 
    references REGION (ZONE_ID, ID)
, constraint FK_DEPT_ASGT__DEPARTMENT foreign key (DEPT_ID) 
    references DEPARTMENT (ID)
, constraint UN_DEPT_ASGT__ZONES unique nonclustered (ZONE_ID, DEPT_ID)
)
create table EMP_ASGT -- Employee Assignment
( REGION_ID int not null
, DEPT_ID int not null
, EMPLOYEE_ID int not null
, constraint PK_EMP_ASGT (REGION_ID, DEPT_ID, EMPLOYEE_ID)
, constraint FK_EMP_ASGT__DEPT_ASGT (REGION_ID, DEPT_ID) 
    references DEPT_ASGT (REGION_ID, DEPT_ID)
, constraint FK_EMP_ASGT__EMPLOYEE (EMPLOYEE_ID) refernces EMPLOYEE (ID)
)
这个交集表非常正常,因为它链接的每个表都有一个外键。此相交表的特殊之处在于唯一约束。这就是为什么一个部门不能位于同一区域内的两个不同区域

最后,我们需要将员工划分为部门和区域。这需要另一个交集表:

create table DEPT_ASGT -- Department Assignment
( REGION_ID int not null
, DEPT_ID int not null
, ZONE_ID int not null
, constraint PK_DEPT_ASGT (REGION_ID, DEPT_ID)
, constraint FK_DEPT_ASGT__REGION foreign key (ZONE_ID, REGION_ID) 
    references REGION (ZONE_ID, ID)
, constraint FK_DEPT_ASGT__DEPARTMENT foreign key (DEPT_ID) 
    references DEPARTMENT (ID)
, constraint UN_DEPT_ASGT__ZONES unique nonclustered (ZONE_ID, DEPT_ID)
)
create table EMP_ASGT -- Employee Assignment
( REGION_ID int not null
, DEPT_ID int not null
, EMPLOYEE_ID int not null
, constraint PK_EMP_ASGT (REGION_ID, DEPT_ID, EMPLOYEE_ID)
, constraint FK_EMP_ASGT__DEPT_ASGT (REGION_ID, DEPT_ID) 
    references DEPT_ASGT (REGION_ID, DEPT_ID)
, constraint FK_EMP_ASGT__EMPLOYEE (EMPLOYEE_ID) refernces EMPLOYEE (ID)
)
您将注意到
EMPLOYEE
表中有一个指向
部门的外键,它强制执行每个员工都可以执行的规则