【问题标题】:Referencing multiple primary key(s) in another table引用另一个表中的多个主键
【发布时间】:2013-03-11 06:17:48
【问题描述】:

我正在开发一个新的 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,而不是在字符串中搜索特定的出现。

谁能帮我提出一个“有效”和正确的解决方案来解决这个问题?

【问题讨论】:

    标签: .net sql database


    【解决方案1】:

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

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

    部门

    • ID (PK)
    • 姓名

    员工

    • ID (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)
    )
    

    【讨论】:

      猜你喜欢
      • 2018-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 2020-06-27
      • 2011-11-19
      • 2011-01-11
      相关资源
      最近更新 更多