Многие ко многим в одной сущности с таблицей соединений - PullRequest
0 голосов
/ 24 декабря 2018

У меня есть задача, требующая, чтобы некоторые «специальные» пользователи могли переключаться между учетными записями без необходимости входа в систему.В качестве отправной точки у меня есть таблица соединений, которая состоит только из идентификаторов пользователей.В форме PRIMARY_USER_ID и SECONDARY_USER_ID в качестве внешних ключей из таблицы USERS.Первое, что должно быть реализовано, это GET всех соединений между пользователями.[{"primary_username", "primary_email", "Secondary_username", "Secondary_email"}]

Я создал отношение «многие ко многим» для объекта «Пользователь», где обе стороны отношения относятся к «Пользователь».

@EqualsAndHashCode.Exclude
@ToString.Exclude
@ManyToMany(fetch = FetchType.LAZY, cascade = {
        CascadeType.PERSIST,
        CascadeType.MERGE
})
@JoinTable(name = "CONTACTS_ONE_LOGIN",
        joinColumns = { @JoinColumn(name = "PRIMARY_CONTACT")},
        inverseJoinColumns = {@JoinColumn(name = "SECONDARY_CONTACT")}
)
private Set<Contact> secondaryContacts = new HashSet<>();

@EqualsAndHashCode.Exclude
@ToString.Exclude
@ManyToMany(cascade = {
        CascadeType.REMOVE
},
        mappedBy = "secondaryContacts")
private Set<Contact> primaryContacts = new HashSet<>();

Теперь проблема заключается в том, когда я хочу получить все подключениямежду контактами мне нужно было бы сначала получить всю информацию из таблицы соединений, а затем пройти через каждый PRIMARY_CONTACT_ID, чтобы получить связанные контакты.Что приведет к очень низким показателям.

Я хотел изменить это, чтобы иметь сущность CONNECTED_USERS, которая вместо двух идентификаторов USER имела бы два отношения «многие к одному» для USER.

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "PRIMARY_CONTACT_ID")
private Contact contact;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "SECONDARY_CONTACT_ID")
private Contact contact;

Мой вопрос, это собирается повысить производительность, так как в моей БД разработчика у меня не так много пользователей, чтобы проверить это должным образом?Или есть ли лучший способ сделать это?

1 Ответ

0 голосов
/ 25 декабря 2018

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

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

create index connected_users_fbi on your_table (
    case when secondary_contact_id is not null then primary_contact_id end,
     secondary_contact_id);

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

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

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