Я думаю, вы переоценили это. Я не вижу смысла в отдельной таблице Phone + PhoneDetail. Обычно есть два практических подхода.
1) Простота - Поместите все телефоны в саму запись клиента. Да, он нарушает правила нормализации, но на практике он очень прост и обычно работает до тех пор, пока вы его предоставляете (работа, дом, мобильный телефон, факс, экстренная помощь). Перевернутый код - это просто написать, время на реализацию короче. Извлечь все телефоны с записями о клиентах просто, как и при использовании телефона определенного типа (Customer.Fax).
Недостатки : добавление дополнительных типов телефонов позже является более болезненным, а поиск телефонных номеров - глупым. Вы должны написать SQL как "select * from customer where cell = ? or home = ? or work = ? or emergency = ?"
. Оцените свой дизайн заранее. Если какой-либо из этих вопросов вызывает озабоченность, или вы не знаете, может ли это быть проблемой, воспользуйтесь нормализованным подходом.
2) Расширяемость - Пройдите по маршруту, по которому вы идете. Типы телефонов могут быть добавлены позже, без изменений DDL. Клиент -> Клиент Телефон
Customer (
customerId
)
CustomerPhone (
customerId references Customer(customerId)
phoneType references PhoneTypes(phoneTypeId)
phoneNumber
)
PhoneTypes (
phoneTypeId (H, W, M, F, etc.)
phoneTypeDescription
)