如何在 Cosmos DB 中拥有全局(跨整个容器)唯一约束?
How can I have a globally (across entire container) unique constraint in Cosmos DB?
假设我要存储如下所示的数据
type Person = {
Name:string
PassportNumber:string
}
type PolicyStatus =
|SaleInProgress
|PolicyActive
|Cancelled
type Policy = {
PincipalPerson: Person
PolicyDependents: Person list
PolicyId:int
PolicyState:PolicyStatus
}
(我将这些类型表示为 F# 记录,因为它们看起来很像 json,但不要因此而分心)
我想让 Policy
中出现的每个人都是独一无二的。这意味着,例如,如果某人是某项政策的委托人,则他们不能同时依赖于其他一些政策。
因此,如果我将这些存储在 Policy
集合中,那么我认为没有办法指定家属和委托人的联合应该具有唯一的护照 ID,是吗?
如果我正在使用一些 RDMS,那么我可以让人们使用不同的 table,在 Policy
和 People
之间有一个外键,并且在 PassportNumber
.
那么在 Cosmos DB 中执行此操作的惯用“NoSQL”方式是什么?
没有办法直接在 Cosmos DB 中强制执行您需要的唯一性约束,至少如果您的数据结构与您建议的一样,则不会。 Cosmos DB 支持的唯一性约束基于整个 属性 值(例如,名字 + 姓氏,或 PassportNumber
)的(组合),因此您无法查看值数组。
如果您确实想在数据库级别强制执行唯一性约束并且愿意更改您的数据模型,请考虑将策略嵌入到 person 对象中:
type Person = {
Name: string
PassportNumber: string // with uniqueness constraint
IsPrincipalPerson: Nullable<bool> // specifies if the person is principal or dependent
PolicyId: Nullable<int>
PolicyState: Nullable<PolicyStatus>
}
这个模型的缺点是,如果你需要改变一个策略的状态,你必须在策略id出现的所有人员对象中改变它。因此,您也可以使用以下模型:
type Person = {
Name: string
PassportNumber: string // with uniqueness constraint
IsPrincipalPerson: Nullable<bool> // specifies if the person is principal or dependent
PolicyId: Nullable<int> // refers to a policy object
}
type Policy = {
PolicyId: int
PolicyState: PolicyStatus
}
现在多个人对象可以共享一个策略对象,但仍然强制执行唯一性约束,因为每个人最多只能有一个策略(作为主体或从属)。缺点是您需要自己处理 person.PolicyId
的引用完整性,因为不支持外键关系。
假设我要存储如下所示的数据
type Person = {
Name:string
PassportNumber:string
}
type PolicyStatus =
|SaleInProgress
|PolicyActive
|Cancelled
type Policy = {
PincipalPerson: Person
PolicyDependents: Person list
PolicyId:int
PolicyState:PolicyStatus
}
(我将这些类型表示为 F# 记录,因为它们看起来很像 json,但不要因此而分心)
我想让 Policy
中出现的每个人都是独一无二的。这意味着,例如,如果某人是某项政策的委托人,则他们不能同时依赖于其他一些政策。
因此,如果我将这些存储在 Policy
集合中,那么我认为没有办法指定家属和委托人的联合应该具有唯一的护照 ID,是吗?
如果我正在使用一些 RDMS,那么我可以让人们使用不同的 table,在 Policy
和 People
之间有一个外键,并且在 PassportNumber
.
那么在 Cosmos DB 中执行此操作的惯用“NoSQL”方式是什么?
没有办法直接在 Cosmos DB 中强制执行您需要的唯一性约束,至少如果您的数据结构与您建议的一样,则不会。 Cosmos DB 支持的唯一性约束基于整个 属性 值(例如,名字 + 姓氏,或 PassportNumber
)的(组合),因此您无法查看值数组。
如果您确实想在数据库级别强制执行唯一性约束并且愿意更改您的数据模型,请考虑将策略嵌入到 person 对象中:
type Person = {
Name: string
PassportNumber: string // with uniqueness constraint
IsPrincipalPerson: Nullable<bool> // specifies if the person is principal or dependent
PolicyId: Nullable<int>
PolicyState: Nullable<PolicyStatus>
}
这个模型的缺点是,如果你需要改变一个策略的状态,你必须在策略id出现的所有人员对象中改变它。因此,您也可以使用以下模型:
type Person = {
Name: string
PassportNumber: string // with uniqueness constraint
IsPrincipalPerson: Nullable<bool> // specifies if the person is principal or dependent
PolicyId: Nullable<int> // refers to a policy object
}
type Policy = {
PolicyId: int
PolicyState: PolicyStatus
}
现在多个人对象可以共享一个策略对象,但仍然强制执行唯一性约束,因为每个人最多只能有一个策略(作为主体或从属)。缺点是您需要自己处理 person.PolicyId
的引用完整性,因为不支持外键关系。