我正在开发一个新的网络应用程序,为此我还需要定义它的数据库结构。
问题是我有一个名为 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/