我正在尝试在MSSQL 2005中为我的公司设置电话列表。
我有工作的当前架构,但我想在员工表中添加一个名为" EmployeeCompany"让它从" CompanyName"部门栏目。
如果Department表中的CompanyName不是PK,我如何链接这两列?
非常感谢任何帮助。
谢谢你, CJ
答案 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
案例2 - 自然复合键
答案 2 :(得分:1)
如果您了解员工的部门,并且了解部门的公司,那么您也了解员工的公司。您可以在SQL中将其表达为一个简单的JOIN,如果您希望简化客户端代码,甚至可以在VIEW后面“隐藏”此JOIN。
作为一般规则:除非您尝试解决特定的性能问题,否则不应存储可以推断的数据。
让我打破这一思路:
但是,通过“滥用”参照完整性迁移属性这一事实,可以实现冗余和完整性。 Damir's answer的“案例2”探讨了一种方式,让我提供另一种方式:
如您所见,外键(上图中的FKx
)不必引用主键 - 它也可以引用备用键(Ux
)。这允许您将Company_id
和Department_id
作为其各自表格的主键,并避免干扰模型 3 的其余部分。
1 如果有两个数据描述同一个事物,并且其中一个数据被更新,那么你总会遇到一个危险(例如,由于应用程序错误)更新另一个。除非你可以哄骗DBMS本身为你做这件事,正如答案中所述。
2 例如过多的JOIN或昂贵的聚合。
3 I.e.其他可能引用公司或部门的表格。
答案 3 :(得分:0)
我会创建一个名为Company的第三个表,它有两列 - CompanyId(主键)和CompanyName。然后,我将使用CompanyId作为Department中的外键,然后使用DepartmentId作为Employee中的外键。