如何设计员工可以属于部门或部门的数据库

时间:2009-10-08 12:13:21

标签: database-design

我有一个存储员工,部门和部门的数据库。每个员工都可以属于部门或部门(1对1关系)。为了存储这些数据,我创建了三个表:Employees,Departments,Division。如何正确连接它们以存储这种关系。

最简单的方法是在Employees表(department_id和division_id)中有两个可以为空的外键,但我想知道是否有更好的方法可以做到这一点?

4 个答案:

答案 0 :(得分:2)

不一定更好,但另一种方法是将部门和部门建模为更一般的实体“业务部门”的子类型,然后将员工与业务部门联系起来。

答案 1 :(得分:0)

替代答案:

如果您遇到分部和部门的两个表,请将员工分配到一种业务单位并使用ID进行引用。

添加一个名为'assignment_type'的表,其中包含两个记录(今天):division,department。

添加一个名为'employee_assignment'的表,其中包含三列:employee_id(fk),d_id(fk),assignment_type(fk)。

答案 2 :(得分:0)

由于您正在与员工和部门打交道,我猜您不是一直在批量加载这些数据的大量行。基于该假设,检索是重要的。

由于有多种方法可以存储此数据,因此您需要考虑检索此数据所需的查询类型。您必须实施哪些类型的搜索,报告或数据加载。基于此,您应该查看存储数据的每种方式以及编写所需查询的性能和易用性。如何添加索引等。存储数据的最酷方式可能最终成为查询所需方式的主要痛苦。

答案 3 :(得分:0)

托尼的业务部门方法是一种方法,特别是如果集合{Devision,Department}将来可能增长。

另一种方法是使用两个外键方法,但包括一个检查约束,以便Employee表中的一个且只有一个列是非NULL。

你可以沿着更远的路线走下去 - 例如如果Department和Devision表的主键的域是不相交但兼容的,您可以在Employees表中创建一个(一组)列,这些列(取决于它们的值)是对部门或部门的引用,然后使用计算列作为外键约束的源。

一切都是可行的,你必须选择你最自然的东西。