簡體   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