0

我正在尝试在 MSSQL 2005 中为我的公司设置电话列表。

我拥有的当前架构有效,但我想在名为“EmployeeCompany”的员工表中添加一个列,并让它从部门的“CompanyName”列中提取。

如果 Department 表中的 CompanyName 不是 PK,我将如何链接这两列?

任何帮助是极大的赞赏。

谢谢你,CJ

数据库设计示例

4

4 回答 4

1

如果你知道员工的部门,你知道部门的公司,那么你也知道员工的公司。您可以将其表示为 SQL 中的简单 JOIN,如果您希望简化客户端代码,甚至可以将此 JOIN“隐藏”在 VIEW 后面。

作为一般规则:除非您试图解决特定的性能问题,否则不应存储可以推断的数据。

让我分解一下这个思路:

  • 如果可以从数据库中已有的数据中推断出一条数据,
  • 然后尝试将其存储在数据库中是多余的
  • 并且不必要地占用存储空间
  • 并可能导致数据不一致1
  • 因此不应物理存储在数据库中,
  • 除非您尝试通过缓存冗余数据来解决特定的、可测量的性能问题,否则该问题足够严重2以证明数据不一致的危险是合理的。

但是,有一种方法可以通过“滥用”引用完整性迁移属性这一事实来同时具有冗余和完整性。达米尔回答的“案例2”解释了一种方式,让我提供另一种方式:

在此处输入图像描述

如您所见,外键(FKx在上图中)不必引用主键 - 它也可以引用备用键(Ux)。这使您可以保留Company_idDepartment_id作为各自表的主键,并避免干扰模型的其余部分3


1如果有两条数据描述同一事物,其中一条已更新,那么您总是有可能忘记更新另一条(例如,由于应用程序错误)。除非您可以诱使 DBMS 自己为您做这件事,如答案中所述。

2例如过多的 JOIN 或昂贵的聚合。

3即可能引用公司或部门的其他表格。

于 2013-03-17T11:41:22.990 回答
1

案例 1——使用 ID

在此处输入图像描述


案例 2——自然的复合键

在此处输入图像描述

于 2013-03-14T18:13:41.890 回答
1

在部门表中,您存储的company_id是键,而不是company name.

当你想查询员工所在的公司时,你可以这样做:

SELECT
   LastName,
   FirstName,
   CompanyName
FROM
   Employee
   INNER JOIN Department ON employee.department_id = department.department_id
   INNER JOIN Company ON department.company_id = company.company_id
于 2013-03-14T15:58:10.840 回答
0

我将创建第三个名为 Company 的表,它有两列 - CompanyId(主键)和 CompanyName。然后我会使用 CompanyId 作为 Department 中的外键,然后使用 DepartmentId 作为 Employee 中的外键。

于 2013-03-14T15:57:44.137 回答