Как следует применять уникальные множества в моделях Django ManyToMany или MySQL? - PullRequest
2 голосов
/ 10 июня 2011

Моя модель Джанго выглядит так:

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

Я хочу обеспечить уникальность среди токенов, т. Е. Если уже есть сущность с токенами ['a', 'b', 'c'], я не хочу добавлять еще одну с помощью ['a', 'b ',' c ']. Однако сущность с токенами ['a', 'b', 'c', 'd'] или ['a', 'b'] является другим набором и должна быть добавлена.

В случае, когда сущность с определенным набором уже найдена, я хочу добавить новые примеры, которые были обнаружены к этому ManyToMany. Старое имя может остаться.

В настоящее время я запускаю запрос, чтобы получить существующую сущность с точным набором токенов (это само по себе является проблемой в django), а затем, если он найден, я обновляю его новым примером. Проблема заключается в том, что это выполняется в нескольких процессах на нескольких серверах, поэтому существует условие состязания между проверкой, существует ли соответствующий объект, и созданием нового, если он не был найден. Это может привести к созданию сущностей с дублирующимися наборами токенов.

Одно решение, которое я придумала, - это использовать явную сквозную модель для ManyToMany и переопределить метод сохранения для сквозной модели, чтобы создать хэш набора токенов и включить его в саму сквозную модель в столбце с уникальное ограничение. Я думаю, что это сработает, но это не выглядит особенно элегантным решением.

Я бы также предположил, что эта проблема в какой-то степени распространена в среде SQL с таблицами сопоставления в случае, когда вам нужен уникальный набор - возможно, здесь есть хорошо известное решение? Я, конечно, открыт для использования raw sql.

Заранее спасибо за помощь!

1 Ответ

2 голосов
/ 10 июня 2011

Я не совсем уверен, что этот метод решает вашу проблему, но здесь идет.

Друг, который работает с Большими базами данных страховой компании, искал способ быстрого обнаружения точных дубликатов в нескольких базах данных на основе подмножества столбцов. Я предложил взять набор столбцов, с которыми он проверял, пропустить их через своего рода canonicalifier ™, вычислить дайджест MD5 и сохранить его как дополнительный индексированный столбец для таблицы. Присоска бежала, как смазанная молния.

Так что, может быть, вы можете сделать что-то подобное. Это не относится к вашему состоянию гонки (ничего, о чем я не могу думать), но это может значительно упростить проверку дуэлей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...