В настоящее время я работаю над веб-бизнес-приложением, в котором есть много объектов (людей, организаций) с большим количеством контактной информации, т.е. несколько почтовых адресов, адресов электронной почты, телефонных номеров и т. д.
В настоящий момент схема базы данных такова, что таблица персон имеет столбцы почтовых адресов, столбцы номеров телефонов, как и таблица организаций. Это не хороший способ справиться с этим.
Я читал c2 Wiki по этому вопросу, и есть хорошее обсуждение относительно моделей контактов и адресов (http://c2.com/cgi-bin/wiki?ContactAndAddressModels) и более или менее физические адреса являются архаичными (http://c2.com/cgi-bin/wiki?ArePhysicalPostalAddressesArchaic).) Эти два обсуждения действительно открыли мне глаза на масштабы этой проблемы.
Я думаю о разделении полей контактной информации на отдельные таблицы . Но какой лучший способ сделать это. В настоящее время приложение в основном обрабатывает финские адреса, но на горизонте ему необходимо также обрабатывать международные адреса.
Я мог бы определить таблицу «адреса», таблицу «номера телефонов», таблицу «адреса электронной почты» и т. Д., И они будут связаны с людьми и организациями. Но это выглядит слишком похоже на предыдущее решение: неизбежно, что предопределенной схемы базы данных недостаточно.
Я предлагаю создать схему контактной информации / логику программы, которая будет динамической :
- Нет предварительно определенных полей с контактной информацией / наборов полей
- Пользователи могут определять новые типы контактной информации и необходимые поля в любое время, например,
- финский почтовый адрес
- Шведский почтовый адрес
- ... почтовый адрес
- Номер телефона
- Адрес электронной почты
- ICQ номер
Возможно ли это? Кто-нибудь делал что-нибудь подобное?
Может быть таблица, определяющая типы контактной информации:
типы контактной информации
- Id: Идентификатор
- Наименование: "Финский почтовый адрес"
- Описание: "Используйте этот тип контактной информации для финских почтовых адресов"
Тогда может быть таблица, которая определяет, какие поля используются для каждого типа контактной информации:
поля типа контактной информации
- Id: идентификатор
- Contact_information_type_id: ссылается на предыдущую таблицу
- Заголовок поля: «Адресная строка 1»
- Описание поля: «Использовать эту строку для первой строки почтовых адресов»
- Тип поля: String / Integer / и т. Д.
- Формат поля: регулярное выражение для проверки данных поля
- Порядок полей: в каком порядке должно отображаться это поле при отображении / использовании этой контактной информации, тип
Тогда у нас будет «таблица контактной информации», которая просто используется для сопоставления полей контактной информации:
контактная информация
- Id: идентификатор
- Contact_information_type_id: ссылается на таблицу типов контактной информации
Тогда у нас будет «контактная информация о человеке» - таблица, отображающая различную контактную информацию о лицах:
контактные данные человека
- Id: Идентификатор
- Contact_information_id: ссылка на таблицу контактной информации
- Идентификатор лица: Ссылка на человека
Тогда нам понадобятся таблицы для каждого типа поля контактной информации, например:
контактные данные целочисленных полей
Id: Идентификатор
Contact_information_id: Ссылка на таблицу контактной информации
Значение: значение этого поля
и так далее для строк и т.д ...
Наконец, при отображении другой контактной информации о данном человеке это происходит через контактную информацию о человеке -table подсматривает, какие поля используются для формирования этой контактной информации из полей типа контактной информации -таблица через контактная информация -таблица. После определения того, какие поля используются, все необходимые таблицы будут объединены.
У меня есть сомнения по поводу возможности использования SQL. Есть мысли?
В Java я, вероятно, мог бы запрограммировать некоторую логику, чтобы определить, какие таблицы необходимы для формирования объекта контактной информации, а затем я мог бы использовать некоторый вид динамических компонентов для представления этих данных в Java. Но для меня это тоже немного туманно. Есть мысли по этому поводу?