簡體   English   中英

SQL:如何設計版本化的鍵:值對,允許非唯一值?

[英]SQL: How do I design a versioned key:value pair, allowing for non-unique values?

我正在尋找有關如何在任何 SQL 風格中實現版本化 key:val 對的建議。

(讓我們現在假設 SQlite 和 Postgres。)

我有一個初步是這樣的表:

locale key version -> value

語言環境和鍵構成了原始的未版本化候選/主鍵。 添加版本以允許存儲多個版本。

棘手的部分是源數據中的“更新”(我無法控制)可能會在不更改值的情況下增加版本號。 在這些情況下,我想禁止增加版本號。

但是,我不能規定該值是唯一的,因為我希望允許值切換,例如

en_US key1 1 -> "hello world"
en_US key1 42 -> "henlo world"
en_US key1 57 -> "hello world"

是一個有效的序列:錯誤被意外引入然后回滾。 保留大約在版本 42 中存在的數據很重要。

然而,我們可能經常發現源數據的版本 58 沒有更新鍵的值——所以這是一個“最后修改於”版本語義。

例如,以下是無效序列:

en_US key1 57 -> "hello world"
en_US key1 58 -> "hello world"

為了保留“上次修改”語義,不應添加第 58 版條目。

我可以進行“插入如果”樣式檢查並查詢語言環境/密鑰的最新版本是否與收到的版本匹配,但我擔心這會讓我面臨競爭條件。

在 sqlite/postgres 中是否有更基本的方法來模擬這個約束? 我不確定這種約束的正式名稱是什么。 (這不是很“獨特”。)

您提到的約束是業務規則。 這是一個完美的邏輯需求的例子,不能在關系模式中整齊地編碼。 您的規則似乎是“對於由鍵和區域設置標識的給定記錄,系統應拒絕插入值與最新值相同的插入”。

大多數數據庫約束旨在對表之間的身份或關系或屬性可能具有的數據類型進行建模。 業務規則可能與這些問題一致(例如“所有電話號碼必須是唯一的”),但這不是關系約束的主要目的。

因此,我會在您實現任何其他業務規則時實現這一點,通過在應用程序邏輯中、在您的 SQL 語句中或通過表上的觸發器進行驗證。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM