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

Database design 如何设计一个员工可以属于部门或部门的数据库,database-design,Database Design,我有一个存储员工、部门和部门的数据库。每个员工可以属于一个部门或部门(1对1关系)。为了存储这些数据,我创建了三个表:员工表、部门表和部门表。我如何正确地连接它们以存储这种关系 最简单的方法是在Employees表(department_id和division_id)中包含两个可为空的外键,但我想知道是否有更好的方法?不一定更好,但另一种方法是将部门和部门建模为更一般实体“业务单元”的子类型,然后将员工链接到业务部门。备选答案: 如果您无法使用部门和部门的两个表,请将员工分配到一种类型的业务部门

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


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

不一定更好,但另一种方法是将部门和部门建模为更一般实体“业务单元”的子类型,然后将员工链接到业务部门。

备选答案:

如果您无法使用部门和部门的两个表,请将员工分配到一种类型的业务部门,并使用id进行引用

添加一个名为“分配类型”的表,其中包含两条记录(今天):部门,部门


添加一个名为“employee_assignment”的表,该表有三列:employee_id(fk)、d_id(fk)、assignment_type(fk)。

由于您处理的是员工和部门,我猜您不会一直大量加载这些数据行。基于这个假设,检索才是最重要的


<>因为有几种方法来存储这些数据,所以需要考虑检索这些数据所需的查询类型。您必须实现哪些类型的搜索、报告或数据加载。基于此,您应该了解存储数据的每种方法,以及编写所需查询的性能和易用性。如何添加索引等。存储数据的最酷方式可能最终会成为查询所需方式的一大难题。

Tony的业务单元方法是一种方法,特别是如果set{division,Department}将来可能会增长的话

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

您可以进一步选择—例如,如果部门表和部门表的主键域不相交但兼容,您可以在Employees表中创建单个(一组)列,这些列(取决于其值)是对部门或部门的引用,然后使用计算列作为外键约束的源


所有这些都是可行的,你必须按照你认为最自然的方式去做。

这可能就是我要走的路。问题:部门是否也属于部门?如果是这样,您将需要BusinessUnits表中的自引用FK。