Какие сущности использовать лучше для сохранения контактов в БД?
В моем пет-проекте на Java Spring я хочу дать возможность юзеру при регистрации указать контакты (они будут автоматически прикрепляться к объявлениям которые создаёт пользователь и будут видны всем). В качестве контактов юзер может указать phoneNumber и telegramUsername (в идеале оба), но может и что-то одно из пары phoneNumber, telegramUsername. Вопрос в том как хранить его контакты в БД.
1) Можно создать класс(таблицу) ContactInfo с полями phoneNumber, telegramUsername. Но в таком случае если юзер указывает один контакт, то мы получает пустое (null) поле, и как следствие не соответствие 3НФ.
2) Можно создать два класса(таблицы) phoneNumber и telegramUsername, которые будут связаны с классом User "0..1 к 1". Но это выглядит как костыль и возможно избыточное создание сущностей.
Какой из 2 подходов лучше?
Существуют ли какие-то другие подходы для таких ситуаций?
Раз вопрос теоретический, то стоит учесть теоретическую возможность того, что контактный телефон будет не международной записью мобильного (у которой, кстати, тоже есть нюансы), а "8 (4922) 33-33-33 доб. 114, звонить строго с 8 до 17, позвать Аделаиду".
Да и мобильный в реальности может оказаться с ограничением "пиши в вайбер, на хрена мне платить за ваши входящие".
Есть ещё третий путь:
И номер телефона и юзернейм - это обычные строки. Собственно любой другой контакт тоже будет строкой.
=> Можно сделать таблицу Contact с колонками:
contact_id, user_id, contact_type, contact_value
Чисто теоретически такой вариант решения красив и хорош, но немного усложняет момент когда я буду подгружать данные в атрибутах на веб-страницу, в моих вариантах я вызывал что-то типо if (advertisement.user.contactInfo.telegramUsername != null) { addAtribute...}
То в предложено варианте это будет что-то вроде: List <Contact> usersContacts = advertisement.user.getContacts();
for(int i = 0; i < usersContacts.length(); i++) {
if(contact[i].contactType == contactType.TG_USERNAME) {addAtribute..."tgUsername"}
else if (contact[i].contactType == contactType.PHONE_NUMBER) {addAtribute..."phoneNumber"}
}
Правильно ли я понимаю реализацию вашей концепции в контексте подгрузки атрибутов? (возможно есть варианты оптимизации и сокращения кода)
P. S. В названии Теоретический, чтобы люди заходили и не боялись что тут гора кода
Это вопрос из теории нормальных форм РСУБД. С точки зрения, теории нужно максимально инкапсулировать данные по связям. С практической точки зрения, скорость работы будет тем выше чем меньше физических таблиц.
Но если не зацикливаться на РСУБД, то NoSQL-решения позволят сохранять и обрабатывать неоднородные структуры значительно эффективнее своих реляционных предков.