数据库设计101:如何链接两列

时间:2013-03-14 15:55:41

标签: sql-server-2005 database-design constraints

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

我有工作的当前架构,但我想在员工表中添加一个名为" EmployeeCompany"让它从" CompanyName"部门栏目。

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

非常感谢任何帮助。

谢谢你, CJ

Database Design Example

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

案例1 - 使用ID

enter image description here


案例2 - 自然复合键

enter image description here

答案 2 :(得分:1)

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

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

让我打破这一思路:

  • 如果可以从数据库中已有的数据中推断
  • 然后尝试将其存储在数据库中冗余
  • 并且不必要地占用存储空间
  • 可导致数据不一致 1
  • 因此不应在数据库中实际存储
  • 除非存在特定的,可测量的性能问题,您正在尝试通过缓存冗余数据来解决这个问题,这是足够严重的 2 来证明数据不一致的危险。< / LI>

但是,通过“滥用”参照完整性迁移属性这一事实,可以实现冗余和完整性。 Damir's answer的“案例2”探讨了一种方式,让我提供另一种方式:

enter image description here

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


1 如果有两个数据描述同一个事物,并且其中一个数据被更新,那么你总会遇到一个危险(例如,由于应用程序错误)更新另一个。除非你可以哄骗DBMS本身为你做这件事,正如答案中所述。

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

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

答案 3 :(得分:0)

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