在SQL Server 2008中,如何设计1:1和1:m关系?
最佳答案
任何关系都要求“父”表(一侧)具有主键(或唯一键)(PK),该键唯一地标识每一行,而“子”表(另一侧)具有一个或多个外键列,必须使用与父表中主键的某些现有值相同的值进行填充。如果您想要一对多(1-M)关系,则外键应该是子表中可以重复的普通属性(列或列),可以重复(可以有很多行具有相同的值)
如果您想要一对一(1-1)的关系,那么外键本身应该是子表中的主键或唯一索引,以确保子表中最多可以有该值的一行。
1-1关系有效地将一个表中的属性(列)划分为两个表。这称为垂直分割。通常这样做是为了对表实体进行子分类,或者出于另一个原因,如果表中列的使用模式表明与其他列相比,需要更频繁地访问一些列。 (假设一或两列将每秒被访问1000次,而其他40列将仅每月被访问一次)。实际上,以这种方式对表进行分区将针对这两个不同的查询优化存储模式。
子分类。上面实际上创建了一个1到0或一个关系,该关系用于所谓的子类或子类型关系。当您有两个不同的实体共享大量的属性,但是其中一个实体具有其他实体不需要的其他属性时,就会发生这种情况。一个很好的例子可能是雇员和SalariedEmployees。 Employee表将具有所有雇员共享的所有属性,并且SalariedEmployee表将与Employees存在(1-0/1)关系,并具有仅Salaried雇员需要的其他属性(Salary,AnnualVacation等)。
如果您确实想要1-1关系,则必须添加另一种机制以确保子表在父表中的每个记录/行始终具有一个记录。通常,执行此操作的唯一方法是在用于插入数据的代码中强制执行此操作(在触发器,存储过程或数据库外部的代码中)。这是因为,如果在两个要求行始终都位于两个表中的表上添加了引用完整性约束,则不可能在不违反约束之一的情况下向其中一个添加行,并且也不能在两个约束中都添加行表在同一时间。