gpt4 book ai didi

mysql - 应该如何在 Django ManyToMany 模型或 MySQL 中实现唯一集?

转载 作者:行者123 更新时间:2023-11-29 02:35:12 29 4
gpt4 key购买 nike

我的 Django 模型如下所示:

class Entity(models.Model):
name = models.CharField(max_length=40)
examples = models.ManyToManyField(Example, blank=True)
tokens = models.ManyToManyField(Token, blank=True, null=True)

我想在 token 之间强制执行唯一性,即如果已经有一个带有 token ['a', 'b', 'c'] 的实体,我不想添加另一个带有 ['a', 'b ', 'C']。但是,带有标记 ['a', 'b', 'c', 'd'] 或 ['a', 'b'] 的实体是不同的集合,应该添加。

在已经找到具有特定集合的实体的情况下,我想将已发现的新示例添加到该 ManyToMany。旧名称可以保留。

目前,我运行一个查询来获取一个现有实体,该实体具有所讨论的确切 token 集(这本身就是 django 中的一个挑战),然后如果找到它,我会用新示例更新它。问题在于它在多个服务器上的多个进程中运行,因此在检查匹配实体是否存在与创建新实体(如果未找到)之间存在竞争条件。这可能会导致创建具有重复 token 集的实体。

我想出的一个解决方案是为 ManyToMany 使用显式直通模型,并覆盖直通模型的保存方法以创建 token 集的哈希并将其包含在直通模型本身的列上唯一约束。我认为这可行,但它似乎不是一个特别优雅的解决方案。

我还可以想象,在您想要一个唯一集的情况下,这个问题在带有映射表的 SQL 领域中有些常见 - 也许这里有一个众所周知的解决方案?我当然愿意使用原始 sql。

预先感谢您的帮助!

最佳答案

我不完全确定这种方法能解决您的问题,但可以。

一位在 Big 保险公司数据库中工作的 friend 正在寻找一种方法,以基于列的子集快速检测跨多个数据库的精确欺骗。我建议采用他正在检查的一组列,通过某种 canonicalifier™ 运行它们,计算 MD5 摘要,并将其保存为表的附加索引列。 Sucker 跑得像油腻的闪电。

所以也许您可以做类似的事情。它没有解决您的竞争条件(我想不出有什么),但它可以显着简化重复检查。

关于mysql - 应该如何在 Django ManyToMany 模型或 MySQL 中实现唯一集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6301022/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com