sql - 设计1 :1 and 1:m relationships in SQL Server

标签 sql sql-server sql-server-2008 database-design data-modeling

在 SQL Server 2008 中,如何设计 1:1 和 1:m 关系?

最佳答案

任何关系都要求“父”表(一侧)具有主(或唯一)键 (PK),唯一地标识每一行,并且“子”表(另一侧)具有外键必须使用与父表中主键的某些现有值相同的值填充的一列或多列。如果您想要一对多(1-M)关系,那么外键应该是子表中可以重复的普通属性(列或多列)(可以有许多行具有相同的值)

如果您想要一对一 (1-1) 关系,则外键本身应该是子表中的主键或唯一索引,以保证子表中最多可能有一行具有该值.

1-1 关系有效地将表中的属性(列)划分为两个表。这称为垂直分割。这样做通常是为了对表实体进行子分类,或者出于其他原因,如果表中列的使用模式表明某些列需要比其他列更频繁地访问其余的列。 (假设一两列每秒被访问 1000 次,而其他 40 列每月仅被访问一次)。以这种方式对表进行分区实际上将优化这两个不同查询的存储模式。

子分类。上面实际上创建了一个 1 到 0 或 1 的关系,用于所谓的子类或子类型关系。当您有两个不同的实体共享大量属性,但其中一个实体具有另一个实体不需要的附加属性时,就会发生这种情况。一个很好的例子可能是EmployeesSalariedEmployeesEmployee 表将包含所有员工共享的所有属性,SalariedEmployee 表将与员工以 (1-0/1) 关系存在,并具有附加属性(薪水年假等)只有受薪员工才需要。

如果你确实想要一对一的关系,那么你必须添加另一种机制来保证父表中的每条记录/行在子表中始终有一条记录。通常,执行此操作的唯一方法是在用于插入数据的代码中强制执行此操作(在触发器、存储过程或数据库外部的代码中)。这是因为,如果您在两个表上添加了引用完整性约束,要求行始终位于两个表中,则在不违反约束之一的情况下不可能向任一表添加行,并且无法向两个表添加行表同时。

关于sql - 设计1 :1 and 1:m relationships in SQL Server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5112473/

相关文章:

sql - 如何在 MSSQL 2008 字符串连接中替换表变量

sql-server - 如何优化“XQuery” SQL

mysql - 基于星期几列透视 MySQL 表

c# - 在 ASP.NET 中使用带有 join 的 where 子句

sql-server - 为什么 T-SQL 排名值返回可为空的列?

sql-server - 如何将数据从 ELK 传输到 SQL Server?

sql-server - 最好的 SQL Server 性能优化技术是什么?

sql-server-2008 - 从 SQL Server 2000 迁移到 2008 和 IIS6-IIS7 后,经典 ASP 出现间歇性 "Out of present range"

mysql - 拥有 "relational database?"是否安全

sql - PLPGSQL - 获取一组具有计数的行的存储过程