我读过 Eric Evans 的领域驱动设计一书,并且一直在尝试应用其中的一些概念。
在他的书中,Eric 谈到了聚合以及聚合根应该如何具有唯一的全局 ID,而聚合成员应该具有唯一的本地 ID。我一直在尝试将该概念应用于我的数据库表,但遇到了一些问题。
我的 PostgreSQL 数据库中有两个表:设施和员工,可以将员工分配到单个设施。
过去,我会按如下方式布置员工表:
CREATE TABLE "employees" (
"employeeid" serial NOT NULL PRIMARY KEY,
"facilityid" integer NOT NULL,
...
FOREIGN KEY ("facilityid") REFERENCES "facilities" ("facilityid")
);
其中employeeid 是一个全球唯一的ID。然后,我将在后端添加代码以进行访问控制验证,防止一个设施的用户访问与其他设施相关的行。我有一种感觉,这可能不是最安全的方法。
我现在考虑的是这种布局:
CREATE TABLE "employees" (
"employeeid" integer NOT NULL,
"facilityid" integer NOT NULL,
...
PRIMARY KEY ("employeeid", "facilityid"),
FOREIGN KEY ("facilityid") REFERENCES "facilities" ("facilityid")
);
其中employeeid 对于给定的facilityid 是唯一的(本地),但需要与facilityid 配对才能在全球范围内唯一。
具体来说,这就是我要找的:
员工 A (employeeid: 1, facilityid: 1)
员工 B (employeeid: 2, facilityid: 1)
员工 C (employeeid: 1, facilityid: 2)
其中 A、B 和 C 是 3 名不同的员工,并且...
将员工 D 添加到设施 1 会给他钥匙(employeeid:3,facilityid:1)
将员工 E 添加到设施 2 会给他钥匙(employeeid: 2、facilityid:2)
我看到了两种实现这一目标的方法:
我可以使用触发器或存储过程来自动生成新的员工 ID,并将每个设施的最后一个 ID 存储在另一个表中以便更快地访问,但我担心并发问题并最终导致来自同一设施的 2 名员工具有相同的 ID。
我可以为每个设施创建一个新序列来管理员工 ID,但我担心最终需要管理数千个序列,并且在删除设施的情况下会删除这些序列。这有什么问题吗?对我来说似乎很重。
我应该采取哪种方法?有什么我错过的吗?