3

我正在开发一个新的 Web 应用程序,为此我还需要定义它的数据库结构。

问题是我有一个名为 的表Department,其中包含:

id: int
name: varchar

还有一张桌子叫Employee

id: int
name: varchar
dept: Department.id(s) (Foreign Key)

问题是一个员工可能属于多个部门,我无法弄清楚如何将这些信息存储在表中,例如:

如果客户 001 属于部门 004,005 和 006,那么我如何将这三个部门键存储在一列中,即 Employee.dept?

我发现一种可能的方法可以将它们存储为分隔字符串,如“004,005,006”,但为此我必须将它们来回转换为字符串和 int,而不是在字符串中搜索特定的出现。

任何人都可以帮助我为这个问题提出一个“有效”和正确的解决方案吗?

4

1 回答 1

8

不要将它们存储ID为逗号分隔值。这是一个非常非常糟糕的设计。正确规范化表格。

这是一种Many-to-Many关系。所以你的架构上应该有三个表,

部门

  • 身份证(PK)
  • 姓名

员工

  • 身份证(PK)
  • 姓名

Employee_Department

  • 部门 ID (FK)
  • 员工 ID (FK)

所以当翻译成真正的 DDL 时,

CREATE TABLE Department
(
    ID INT,
    NAME VARCHAR(50),
    CONSTRAINT dept_pk PRIMARY KEY (ID),
    CONSTRAINT dept_uq UNIQUE(Name)
)

CREATE TABLE Employee
(
    ID INT,
    NAME VARCHAR(50),
    CONSTRAINT Emp_pk PRIMARY KEY (ID),
    CONSTRAINT Emp_uq UNIQUE(Name)
)

CREATE TABLE Employee_Department
(
    DepartmentID INT,
    EmployeeID INT,
    CONSTRAINT empdep_pk PRIMARY KEY (DepartmentID, EmployeeID),
    CONSTRAINT empdep_FK1 FOREIGN KEY (DepartmentID)
        REFERENCES Department(ID),
    CONSTRAINT empdep_FK2 FOREIGN KEY (EmployeeID)
        REFERENCES Employee(ID)
)
于 2013-03-11T06:20:01.323 回答