如何跨两个表管理唯一列

时间:2019-07-12 19:21:53

标签: postgresql

我有一个带有主键file_id的文件表。

用户可以上传各种文件,这些文件将附加到许多不同的表中。有人可能会使用不相关的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反之亦然

对我来说,这似乎还很草率。这样的感觉应该是架构本身的解决方案,而不是用于插入的查询。

1 个答案:

答案 0 :(得分:1)

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

我们将这些列称为{ ImageDetails.map((Images) => { return (<img alt="doubt" src={Images.images} />) }) } tablea_id

要确保文件不能与多个表关联,请添加检查约束:

tableb_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_id上放置唯一约束。