Я использовал то, что, я думаю, вы бы назвали подходом к базовым таблицам. Например, у меня были таблицы для имен, адресов и телефонных номеров, каждая из которых была идентифицирована как PK. Затем у меня была основная сущность таблицы сущностей (entityID) и таблица связывания: attribute (entityKey, attributeType, attributeKey), где attributeKey мог указывать на любую из первых трех таблиц, в зависимости от attributeType.
Некоторые преимущества: позволяет использовать столько имен, адресов и телефонных номеров для каждой сущности, сколько нам нужно, легко добавлять новые типы атрибутов, предельно нормализовать, легко извлекать общие атрибуты (т. Е. Идентифицировать дубликаты людей), некоторые другие преимущества безопасности, специфичные для бизнеса.
Недостатки: довольно сложные запросы для создания простых наборов результатов затрудняли управление (т. Е. У меня были проблемы с наймом людей с достаточно хорошими отборами T-SQL); производительность оптимальна для ОЧЕНЬ конкретных случаев использования, а не для общего; Оптимизация запросов может быть хитрой
Прожив с этой структурой в течение нескольких лет после гораздо более долгой карьеры, я не решался бы использовать ее снова, если у меня не будут те же странные ограничения бизнес-логики и шаблоны доступа. Для общего использования я настоятельно рекомендую, чтобы ваши типизированные таблицы напрямую ссылались на ваши объекты. То есть Entity (entityID), Имя (NameID, EntityID, Name), Телефон (PhoneID, EntityID, Phone), Электронная почта (EmailID, EntityID, Электронная почта). У вас будет некоторое повторение данных и некоторые общие столбцы, но будет гораздо проще программировать и оптимизировать.