在设计一对多关系时避免重复

时间:2011-05-05 13:52:27

标签: sql-server database database-design one-to-many duplicate-data

我经历过许多线索,无法弄明白。对不起,如果这是一个重复的问题。请考虑以下设置。

1)员工=> (ID,姓名)

2)部门=> (ID,名称,位置,秘书,会计,中的管理程序,组的管理程序,区域管理器,活动)

部门可以有很多文员,会计师,中层管理人员等。他们只是Employee表中的员工。对于没有数据重复,没有更新异常和无/更少联结表的部门实体,需要一个更好的数据库模式(灵活的,如分区管理器必须容易添加一个新列)。

提前致谢! :)

6 个答案:

答案 0 :(得分:1)

你有多对多的关系,所以你需要第三个关联(联结)表 - 你无法避免它。

DepartmentMember => (DepartmentId,EmployeeId,MembershipRole)

你为什么不想要这个?

答案 1 :(得分:1)

你需要这样的东西;

department employee ERD

CREATE TABLE department(
    dept_id      int    NOT NULL,
    dept_name    char(10)    NULL,
    CONSTRAINT PK1 PRIMARY KEY NONCLUSTERED (dept_id)
)
go


CREATE TABLE department_employee(
    id         int    NOT NULL,
    dept_id    int    NOT NULL,
    emp_id     int    NOT NULL,
    CONSTRAINT PK3 PRIMARY KEY NONCLUSTERED (id)
)
go


CREATE TABLE employee(
    emp_id      int    NOT NULL,
    emp_name    char(10)    NULL,
    CONSTRAINT PK2 PRIMARY KEY NONCLUSTERED (emp_id)
)
go


ALTER TABLE department_employee ADD CONSTRAINT Refdepartment1 
    FOREIGN KEY (dept_id)
    REFERENCES department(dept_id)
go

ALTER TABLE department_employee ADD CONSTRAINT Refemployee2 
    FOREIGN KEY (emp_id)
    REFERENCES employee(emp_id)
go

答案 2 :(得分:0)

部门=>(ID,employeeID,位置,有效) Employee =>(EmployeeID,名称,职位)

我认为这是组织表格的更好方法。这假定active是部门的属性,否则将其移动到employee表。

答案 3 :(得分:0)

Employee =>(ID,name, department_ID, position_ID, Active)
Position =>(ID, name, Active)
Department => (ID,Name,location,Active)

答案 4 :(得分:0)

假设一名员工只能在一个部门工作。如果没有,那么是的,你需要第三个表来避免重复

员工

ID, Name, EmployeeType, DepartmentID
(pk on ID, EmployeeType)

部门

ID, Name, Active

答案 5 :(得分:0)

  

位置/标题非常具有背景性   到部门。一个可以是一个   区域经理在一个部门和   另外还需要顾问   在另一个部门的职位。

然后,部门和员工是多对多的。员工的职位也是多对多的。如果您需要灵活性,例如为部门添加新标题,则必须使用联结表。你无法避免它。

您可以参考以下表格结构以供参考:

Employee 
-----------------------
EmployeeID (PK)
EmployeeName
Active

Department 
-------------------------
DepartmentID (PK)
DepartmenName
Location

Position 
----------------------------
PositionID (PK)
PositionDescription (eg.Clerk, Accountant etc)

EmployeePosition 
----------------------------
EmployeeID  (FK to Employee.EmployeeID )
DepartmentID (FK to Department.DepartmentID)
PositionID (FK to Position.PositionID )
  

如果位置/标题固定为   员工而不是Department.i.e。一个   职员谁是职员,可以在   那个位置到一个或多个部门,   我们该怎么办呢?

您是说在极端情况下,许多员工可以拥有自己的特殊头衔吗?他们属于很多部门?如果是,则假设员工ID 123具有称为“特殊一号”的特殊标题,并且它属于IT,帐户和销售部门。您首先在Position表格中创建此标题(即“The Special One”)并获取Position.PositionID

然后使用此EmployeePosition以及IT,帐户,销售部门的部门ID将Employee.EmployeeID 123的3条记录插入Position.PositionID表。