Nano Hash - криптовалюты, майнинг, программирование

Ограничение Grails GORM

Учитывая следующие два домена:

class Follows {
    User followee
    ...
    static belongsTo = [follower: User]
}

class User {
    String name
    String lastName
    ...
    static hasMany = [ follows: Follows ]
    static mappedBy = [ follows: 'follower' ]
}

Что создает следующую таблицу:

+------+-------------+-------------+
|  id  | follower_id | followee_id |
+------+-------------+-------------+
| 1    | 1           | 3           |
| 2    | 3           | 2           |
| 3    | 2           | 1           |
+------+-------------+-------------+

Есть ли способ через ограничения предотвратить дублирование follower - followee? Я пытаюсь предотвратить оба направления, например, идентификатор пользователя 3 не должен иметь возможность подписываться на идентификатор пользователя 1, если идентификатор пользователя 1 уже подписан на идентификатор пользователя 3.

Другими словами, я пытаюсь предотвратить следующее:

+------+-------------+-------------+
|  id  | follower_id | followee_id |
+------+-------------+-------------+
| 1    | 1           | 3           |
| 2    | 3           | 1           |
+------+-------------+-------------+

Я знаю, что могу запросить базу данных перед вставкой, чтобы проверить, следует ли пользователь 1 за 3 (или наоборот), и если true отменить вставку, но я пытаюсь избежать попадания в БД дважды за follow операция.

Привет и спасибо за все ваши ответы!


Ответы:


1

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

Но вы можете использовать уникальное ограничение, если добавите новое свойство в Follows, содержащее уникальное значение, которое применяется к обоим следующим направлениям.

class Follows {
    User followee
    ...
    Integer someUniqueProperty

    static belongsTo = [follower: User]

    static constraints = {
        someUniqueProperty unique: true
    }

    def beforeInsert() {
        someUniqueProperty = calculateUniqueProperty()
    }

    def beforeUpdate() {
        someUniqueProperty = calculateUniqueProperty()
    }

    private Integer calculateUniqueProperty() {
       [follower.id, followee.id].sort().hashCode()
    }
}

В приведенном выше примере someUniqueProperty должен быть уникальным для всех экземпляров Follows. Его значение устанавливается перед вставкой/обновлением экземпляра путем помещения follower и followee в список всегда в одном и том же порядке, а затем получения хэш-кода. Это основано на том, что: [1, 3].hashCode() == [3, 1].sort().hashCode()

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

07.11.2015
  • Хотя более элегантное решение, такое как использование ограничений, было бы здорово, ваши решения настолько просты, что просто гениальны. Потрясающий ответ! ваше здоровье! 08.11.2015
  • Пожалуйста. Кстати, мое решение использует ограничения. Посмотрите на замыкание ограничений в примере. 08.11.2015
  • Да, я имел в виду простое ограничение для предотвращения дублирования в обоих направлениях вместо использования хэша. Кстати, я протестировал его, и он отлично работает. 08.11.2015
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..