.net - 引用另一个表中的多个主键

标签 .net sql database

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

问题是我有一个名为 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”,但为此我必须将它们来回转换为字符串和整数,然后在字符串中搜索特定事件。

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

最佳答案

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

这是一个多对多关系。所以你的模式应该有三个表,

部门

  • 身份证(PK)
  • 姓名

员工

  • 身份证(PK)
  • 姓名

员工_部门

  • 部门编号 (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)
)

关于.net - 引用另一个表中的多个主键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15332308/

相关文章:

c# - 使用 OPCDA.NET 工具远程访问 OPC 服务器

c# - C#调用BeginInvoke/Invoke时如何获取返回值

SqlPackage.exe 导出/导入数据库

sql - 每个帐户每月的运行总计

SQL Pivot on 文本列返回多行

c# - 替代数据库存储数据?

mysql - 我们可以在聚合函数中使用聚合函数吗?

c# - 为什么ServiceStack中的Redis缓存客户端对于不存在的整数类型的key返回0而不是null?

c# - 是否存在 Dot.Net 4.5 异步计时器

javascript - 用于捕获选票并聚合选票的数据存储