数据库再设计(DatabaseRedesign)(二)

2014-11-24 11:00:39 · 作者: · 浏览: 1
l状态。

如果将最小基数从0改为1,就需要将外键设置为not null,这时需要确保目前存在的数据外键都为not null,否则我们需要先更新数据。根据不同的DBMS产品,修改外键的方式也不一样,但是可以遵循下面的步骤:

1) 删除旧的外键约束;

2) 设置外键列为not null;

3) 添加新的外键约束。

上面的例子修改最小基数的SQL语句如下:

ALTER TABLE EMPLOYEE
    DROP CONSTRAINT DepartmentFK;
ALTER TABLE EMPLOYEE
    ALTER COLUMN DepartmentNumber Int NOT NULL;
ALTER TABLE EMPLOYEE
    ADD CONSTRAINT DepartmentFK FOREIGN KEY (DepartmentNumber)
        REFERENCES DEPARTMENT (DepartmentNumber)    
	    ON UPDATE CASCADE;

级联属性需要根据具体的业务来确定。

child端

在child端设置最小基数非零需要利用触发器或者application code,因而将最小基数从零变为一也需要利用触发器。如果将最小基数从1变为0,直接删除触发器即可。

6.2 增大最大基数

1:1 to 1:N

假设在EMPLOYEE 和PARKING_PERMIT之间存在如图三所示的1:1关系,现在默认employee是parent,因为外键在parking_permit中。当将1:1的关系变为1:N的关系时,需要考虑哪端是parent端(为1)。假如employee还是parent端,则只需要将parking_permit中的外键unique属性去掉即可。如果parking_permit变为parent端,则我们需要将外键移到employee中,还需要数据导入employee表中。具体的操作如下:

1) 在employee中添加可以为null的外键PermitNumber;

2) 将parking_permit中的数据导入employee表中:
UPDATE EMPLOYEE
    SET EMPLOYEE.PermitNumber =
        (SELECT  PP.PermitNumber
         FROM  PARKING_PERMIT AS PP
         WHERE  PP.EmployeeNumber = EMPLOYEE.EmployeeNumber);

3) 将parking_permit中的外键EmployeeNumber删除;

4) 在employee中添加外键约束;

5) 修改相应的触发器和视图。

\

1:N to N:M

将1:N的关系变为N:M的关系比较容易,只需要:创建一个只包含两个表主键的新表(intersection table),然后将两个主键的组合作为新表的主键,每一个分别是依赖于另外每一个表的外键;从child表导入数据,然后删除child中的外键约束。最后修改触发器和视图使其应用新表。

6.3 减小最大基数(存在数据丢失)

将一个N:M的关系降为一个1:N的关系,我们需要在child表中添加一个外键,然后从intersection table中导入外键的数据。修改相应的触发器和视图等,最后将intersection table删除。将一个1:N的关系降为1:1的关系,我们需要将child表中的外键数据变为1,然后将外键约束变为unique。这两种情况都需要决定如何删除数据。