选项1
我有一个看起来像这样的数据库架构: https:
//dbfiddle.uk/JKCTjadD
- A
Task
属于 aService
(如ECS中) - A
Task
可以重新分配给另一个Service
。 TaskConfig
跟踪重新分配历史记录(和其他配置),最新记录(使用inserted_on DESC
)是Service
aTask
当前分配的记录。- A
Service
具有唯一约束 (service_name
,environment
)。环境有自己的表,但为了简洁起见,此处将其图示为枚举。 - A
Task
也有唯一约束 (task_name
,environment
)。
问题
该environment
inTask
是重复/冗余的:Service
与该关联的Task
已经具有该environment
所在Task
的 。
选项2
我决定Service_id
从TaskConfig
: https Task
:
//dbfiddle.uk/QB7k9hK3
然后我可以使用以下查询来获取最新的 ( , ) 对:
task_name
environment_name
SELECT DISTINCT ON (task_name, environment_name) *
FROM TaskConfig
JOIN Task ON Task.id = Task_id
JOIN Service ON Service.id = Service_id
ORDER BY task_name, environment_name, inserted_on DESC
问题
- 我不能再对 (
task_name
,environment
) 有唯一约束,因为environment
不在Task
表中。 - 未来的开发人员可能会错误地选择 (
task_name
,Service_id
) ,这不会产生唯一的 (task_name
,environment
) 对。
帮助
您建议如何解决上述问题?
如果没有更好的方法,上面的 2 个选项中哪一个是更好的模式?