我遇到了一个新需求问题,不知道如何最好地构造数据库表。基本情况如下:
我将员工存储在员工表中。由于产量增加,该公司不得不雇用许多临时雇员。所有这些员工,包括长期员工和临时员工,都必须将数据输入ERP系统。因此,从本质上讲,员工将输入“Orders”,Orders表有一个名为“EnteredBy”的字段。在理想情况下,我会将这两种类型的员工都存储在employees表中。
由于公司的不同系统和公司内部的团队不相互交谈,一些临时员工确实成为了永久员工,因此我们需要一种方法来报告“新”永久员工在“临时员工”期间所做的所有订单,并在技术上“合并”临时员工处理的数据到他们的新永久员工记录中。
并非所有临时雇员都会成为永久雇员。所有订单都必须附有“员工”,即持有员工唯一标识符的外键。
我一直在思考如何将“临时员工”的概念融入到这个数据模型中,并且仍然维护订单的数据完整性。有什么建议吗?
当前DB表结构:
更新1:当我试图在数据库表设计中传达这个问题时,我决定向SO专家寻求建议。在我通过OOP分析解决方案时,[Temp雇员]的设计是[雇员],但我无法将我的大脑包裹在如何将其传达到表设计和CRUD操作中。仅供参考,[雇员]有许多字段,而[Temp雇员]有这些字段的子集,因此它的所有字段都存在于雇员中。
您可以在员工
表上添加一个status
字段,指示该员工是全职还是兼职。创建另一个表,如下所示:
create table temp_change_date (
employeeID int PK (FK),
change_date date
);
当员工从临时变为永久时,在员工表上填充更新触发器。
这样,Orders
会自动映射,您可以使用更改日期查看临时员工期间创建的所有订单。
(我假设可以将临时员工作为员工)
继承是建模中相当常见的场景——在您的案例中,似乎可以扩展现有的员工结构,因此您可以对临时员工进行如下建模:
TemporaryEmployee
- EmployeeID (PK and FK to Employee)
- StartDate
- EndDate
- Other temp employee fields here
由于临时员工也是一名员工,因此它共享员工主键,并且可以通过创建临时员工来强制执行引用完整性。EmployeeId是员工的外键。员工ID。
Orders
的完整性不受影响,因为现有的雇员-订单
RI是不变的。扩展而不是更改的另一个好处是您没有更改任何底层模型,因此应避免因更改ERP系统而导致的回归问题(尽管测试仍然是必不可少的)。
编辑、澄清:
现有的ERP系统表:
CREATE TABLE Employee
(
EmployeeID INT identity(1,1) NOT NULL PRIMARY KEY,
EmployeeTypeId ? -- e.g. might be able to repurpose to identity Temporary employees?
-- Other Employee Fields here ... not all of these will be relevant to TemporaryEmployee
);
CREATE TABLE Orders
(
OrderId INT identity(1,1) NOT NULL PRIMARY KEY,
EmployeeID INT NOT NULL FOREIGN KEY REFERENCES Employee(EmployeeID)
-- etc.
);
现在,您可以使用另一个表扩展员工,而无需更改上述模式:
CREATE TABLE TempEmployee
(
EmployeeID INT NOT NULL PRIMARY KEY,
-- Other extended fields here as per above
CONSTRAINT FK_TempEmployee_Employee REFERENCES Employee(EmployeeID)
);
1. 数据结构的概念 数据结构(Data Structure)是数据的组织方式。程序中用到的数据都不是孤立的,而是有相互联系的,根据访问数据的需求不同,同样的数据可以有多种不同的组织方式。以前学过的复合类型也可以看作数据的组织方式,把同一类型的数据组织成数组,或者把描述同一对象的各成员组织成结构体。数据的组织方式包含了存储方式和访问方式这两层意思,二者是紧密联系的。例如,数组的各元素是一个挨一个存
我想创建一个食谱网站,在那里你可以添加/修改/删除食谱,每个模型都应该有一个配料的列表,与所需的量的那个配料。 我试图使用这样的dict:,但结果是EF Core并不真正喜欢dicts的思想,所以我试图创建一个“映射器”模型,如下所示: 问题是,它仍然没有真正起作用。我不能添加菜谱,也不能删除,因为它进入了一个永远循环。 你将如何实施它? 谢谢
PX4由两个层次组成:一是飞行控制栈(flight stack),即自驾仪的软件解决方案,二是中间件,一种可以支持任意类型自主机器人的通用机器人中间件。 所有的无人机机型,事实上所有的包括船舶在内的机器人系统,都具有同一代码库。整个系统设计是反应式(reactive)的,这意味着: 所有的功能被划分为可替换部件 通过异步消息传递进行通信 该系统可以应对不同的工作负载 除了这些运行时考虑之外,其模块
本文向大家介绍mysql如何比对两个数据库表结构的方法,包括了mysql如何比对两个数据库表结构的方法的使用技巧和注意事项,需要的朋友参考一下 在开发及调试的过程中,需要比对新旧代码的差异,我们可以使用git/svn等版本控制工具进行比对。而不同版本的数据库表结构也存在差异,我们同样需要比对差异及获取更新结构的sql语句。 例如同一套代码,在开发环境正常,在测试环境出现问题,这时除了检查服务器设置
1. 数组的基本概念 数组(Array)也是一种复合数据类型,它由一系列相同类型的元素(Element)组成。例如定义一个由4个int型元素组成的数组count: int count[4]; 和结构体成员类似,数组count的4个元素的存储空间也是相邻的。结构体成员可以是基本数据类型,也可以是复合数据类型,数组中的元素也是如此。根据组合规则,我们可以定义一个由4个结构体元素组成的数组: struc
我们已经详细探讨了多种Python内建的数据结构。这些数据结构将是编写程序时至关重要的部分。 现在我们已经掌握了很多Python的基本知识,我们接下来将学习如何设计和编写一个实用的Python程序。