我有一个带有主键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反之亦然
对我来说,这似乎还很草率。这样的感觉应该是架构本身的解决方案,而不是用于插入的查询。
答案 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
上放置唯一约束。