繁体   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