如何确保create_or_update中的唯一性,而在Django中没有数据库级别的唯一约束

问题描述 投票:0回答:1

我正在将django 1.10与MySQL 5.7一起使用。

我有一个表,该表在多列上具有unique_together约束。但是这些列中很少有可为空的。因此,对于任何这些字段中的空条目,都不能确保数据库级别的唯一性。

我正在使用create_or_update方法来确保应用程序级别的行的唯一性。但是在竞争条件下,即使这样也不能确保唯一性,因为系统是水平缩放的,并且多个进程正在同时尝试调用create_or_update函数。

我认为对于大多数高级服务来说,这应该是非常正常的用例。我们如何处理这个问题?

根据我的想法,我的选择可以是:

  1. 保存字符串,而不是保持条目为空。 (但这是一个外键字段)。
  2. 基于唯一列字段的字段保存格式化的字符串,并检查其唯一性。

我认为这两个选项都不合常理。这里通常遵循的最佳做法是什么?

mysql django concurrency thread-safety scalability
1个回答
0
投票

您的选择不可行:

  1. 如果您说的是外键字段,则无法将字段值设置为字符串。无论如何,生成字符串不是一个好方法
  2. [使用您的字段组合生成字符串,在某些情况下,如果您在相同的字段中具有相同的值,而在其他字段中具有空值,则将生成不唯一的字符串。可能是您认为可以在字符串生成中添加随机键或其他内容,但这会生成唯一的字符串,但是会出错,因为唯一的行会“不同”]

在某些情况下,django中的文本字段不为NULL,除非您指定null=True,否则为空字符串,无论如何,您应该这样做:)

我认为您应该分析模型的商务规则,可能您选择的错误字段是唯一的。

如果您在应用程序级别中进行功能检查,则需要指定它是事务,因为它可能引发错误

© www.soinside.com 2019 - 2024. All rights reserved.