Я бы пошёл дальше ...
Таблица 1 - Компания
CompanyID (int)
CompanyName (string)
Пример
CompanyID 1
CompanyName "Swift Point"
Таблица 2 - Типы контактов
ContactTypeID (int)
ContactType (string)
Пример
ContactTypeID 1
ContactType "AutoEmail"
Таблица 3 Контакты компании
CompanyID (int)
ContactTypeID (int)
Addressing (string)
Пример
CompanyID 1
ContactTypeID 1
Addressing "name@address.blah"
Это решение обеспечивает расширяемость, поскольку вам не нужно добавлять столбцы, чтобы справляться с новыми типами контактов в будущем.
SELECT
[company].CompanyID,
[company].CompanyName,
[contacttype].ContactTypeID,
[contacttype].ContactType,
[companycontact].Addressing
FROM
[company]
INNER JOIN
[companycontact] ON [companycontact].CompanyID = [company].CompanyID
INNER JOIN
[contacttype] ON [contacttype].ContactTypeID = [companycontact].ContactTypeID
Это даст вам несколько строк для каждой компании. Строка для «AutoEmail», строка для «AutoPrint» и, возможно, в будущем строка для «ManualEmail», «AutoFax» или даже «AutoTeleport».
Ответ HLEM.
Да, это действительно модель EAV. Это полезно, когда вы хотите иметь расширяемый список атрибутов с похожими данными. В этом случае меняются методы контакта со строкой, представляющей «адрес» контакта.
Если вы не хотите использовать модель EAV, вам следует рассмотреть реляционные таблицы, а не хранить данные в плоских таблицах. Это потому, что эти данные почти наверняка расширятся.
Ни EAV-модель, ни реляционная модель существенно не замедляют запросы. Объединения на самом деле очень быстрые по сравнению с (например) своего рода. Возврат записи для компании со всеми связанными с ней типами контактов или даже с конкретным типом контакта будет очень быстрым. Я работаю над финансовой базой данных MS SQL с миллионами строк и аналогичными моделями данных, и у меня нет проблем с возвратом значительных объемов данных за доли секунды.
С точки зрения сложности, это не самый технический проект с точки зрения моделирования баз данных, и концепция объединения таблиц, безусловно, ниже той, которую я бы назвал разработкой баз данных "промежуточного" уровня.