繁体   English   中英

如何管理跨两个表的唯一列

[英]How to manage a unique column across two tables

我有一个带有主键file_id的 Files 表。

用户可以上传将附加到许多不同表格的各种文件。 有人可能会使用不相关的 file_id 手动向我的 API 发布请求,这在技术上允许他们在非常特定的情况下访问他们不应该访问的文件。

不幸的是,没有一种好的方法可以重构过去的工作方式来防止这种情况发生。

我的逻辑是,只需使文件 ID 在两个表中都是唯一的。 问题解决了。 如果有人尝试使用他们不应该发送的 file_id 发送请求,我们会看到它已经存在于另一个表中并发送回 500。

但是,我不确定解决此问题的最佳方法是什么......

我的第一个想法是添加一个约束。 虽然我不确定你会如何管理这个。 我所做的大多数研究都提供了不推荐的奇怪变通方法。 虽然理想情况下,如果有一种干净的方法来解决它,这是我更喜欢的方式。

我的第二个是添加如下内容:

insert into table_a (file_id)
select file_id where not exists (select file_id from table_b where table_b.file_id = file_id);

然后对 table_b 反之亦然

这对我来说也有点草率。 感觉这应该是模式本身的解决方案,而不是用于插入的查询。

如果没有太多表,您可以从表中为每个表添加外键,而不是包含文件并以这种方式对关联进行建模。

我们将这些列tablea_idtableb_id

为了确保一个文件不能关联到多个表,添加一个检查约束:

ALTER TABLE files ADD CHECK ((tablea_id IS NULL AND tableb_id IS NOT NULL) OR 
                             (tablea_id IS NOT NULL AND tableb_id IS NULL));

如果您想确定与任一表中的任何行关联的文件都不超过一个,请在tablea_idtableb_id上放置唯一约束。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM