我有一个存储员工,部门和部门的数据库。每个员工都可以属于部门或部门(1对1关系)。为了存储这些数据,我创建了三个表:Employees,Departments,Division。如何正确连接它们以存储这种关系。
最简单的方法是在Employees表(department_id和division_id)中有两个可以为空的外键,但我想知道是否有更好的方法可以做到这一点?
答案 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表中创建一个(一组)列,这些列(取决于它们的值)是对部门或部门的引用,然后使用计算列作为外键约束的源。
一切都是可行的,你必须选择你最自然的东西。