Формат хранения личных контактов в базе данных

Я думаю о лучшем способе хранения личных контактов в базе данных для бизнес-приложения. Традиционным и простым подходом было бы создание таблицы со столбцами для каждого элемента, например Имя, Номер телефона, Должность, Адрес и т. д. Однако для таких данных существуют известные отраслевые стандарты, например vCard, или hCard, или vCard-RDF/XML или даже Контакты Windows XML-схема. Использование стандартного формата даст некоторые преимущества, например совместимость с другими системами. Но как я могу решить, какой метод использовать?

Требования в основном для хранения данных. Запросы на поиск и заказ крайне маловероятны, но возможны. Максимальный объем данных составляет 100 000 записей.

Мое ядро ​​базы данных поддерживает собственные столбцы XML. Я думал использовать некоторый формат на основе XML для хранения личных контактов. Затем можно будет использовать XML-индексы для этих данных, если потребуется поиск и упорядочение. Хороший ли это подход? Какой формат и схему контактов вы бы порекомендовали для этого?

Отредактировано после первых ответов

Вот почему я думаю, что прямой подход — это плохо. Это связано с характером такого рода данных — это не так уж просто.

  1. Личные контакты — это плохо структурированные данные, их можно назвать полуструктурированными. У каждого контакта могут быть разные поля данных, может быть, даже такие поля, которые я не могу предвидеть. На мой взгляд, к каждой части этих данных следует относиться как к важной информации, т. е. ни одна часть данных не может быть отброшена только потому, что в базе данных нет соответствующего столбца.
  2. Если бы мы пошли дальше, предполагая, что никакие данные не могут быть потеряны, мы могли бы создать большой текстовый столбец с именем Comment или Description или Other и поместите туда все, что не может быть хорошо вписано в столбцы таблицы. Но опять же - данные потеряют структуру - это может быть плохо.
  3. Если нам нужны структурированные данные, то в соответствии с принципами проектирования базы данных данные должны быть разложены на сущности, и между сущностями должны быть установлены отношения. Но это добавляет сложности — слишком много сущностей, и нужно принять множество дизайнерских решений, таких как «Как мы храним адрес? Личное имя? Номер телефона? Как мы кодируем номера домашних телефонов и номера мобильных телефонов? Как насчет другой контактной информации?.." Отношения между сущностями сложны и множественны, и каждое отношение является таблицей в базе данных. Каждое отношение должно быть задокументировано в проектных документах. Это очень много работы. Но можно полностью избежать сложности — просто задокументировать, что данные хранятся в соответствии с такой-то и такой-то стандартной схемой, и точка. Тогда любой, кто будет читать этот документ, должен легко понять, о чем он.
  4. Наконец, все дело в использовании отраслевого стандарта. Будем надеяться, что стандарт разработан некоторыми умными людьми, которые предвидели и описали структуру личной контактной информации намного лучше, чем я когда-либо мог. Почему мы все должны изобретать велосипед?? Гораздо проще использовать стандартную схему. Проблема в том, что существует слишком много стандартов — непросто решить, какой из них использовать!

person Gart    schedule 31.05.2010    source источник


Ответы (4)


Не похоже, что у вас есть реальные проблемы с производительностью или пространством. Так что используйте то, что требует меньше времени для написания кода и поддержки!

Возможно, вы захотите разрешить экспорт данных в форматы vCard/hCard и т. д., но не используйте их в качестве хранилища вашего приложения, если вы не считаете, что это приведет к сокращению кодирования/обслуживания в целом.

person Artelius    schedule 31.05.2010
comment
Да, в моем случае нет строгих требований к производительности или пространству. Я просто хочу сделать дизайн максимально простым. - person Gart; 31.05.2010

Упомянутые вами форматы — отличные способы обмена данными между системами, но они не идеальны для хранения в базе данных. Не позволяйте стандартам обмена данными определять структуру базы данных. Какой бы дизайн базы данных вы ни использовали, вы всегда можете создать службу или программу, которая предоставляет данные в формате XML для внешнего использования.

person nvogel    schedule 31.05.2010
comment
Но что тогда должно диктовать мой дизайн базы данных? Я хотел бы избежать сложности - person Gart; 31.05.2010
comment
@Gart Для проектирования реляционной базы данных Бойс-Кодд / 5-я нормальная форма обычно является хорошим местом для начала. Если вам нужны примеры шаблонов, взгляните на: tdan.com/view-articles/ 5014 - person nvogel; 31.05.2010
comment
конечно, нормальные формы являются ключом к дизайну реляционной БД, но извините, я не могу принять ваше решение. Тот пример, который вы приводите, относится к 2002 году, тогда не было соответствующих технологий и стандартов. Этот подход может быть хорош в образовательных целях, но я бы не стал использовать его в продакшене. Это сложно. - person Gart; 31.05.2010
comment
@Gart, наверняка есть стандарты обмена информацией. Я никогда не слышал о таких стандартах проектирования схемы базы данных. Если вы найдете таковых, дайте мне знать! Модель данных партии до сих пор используется в качестве шаблона компаниями и учреждениями. Его возраст значения не имеет. Если это нужно упростить для вашего случая, упростите его. Я бы не рекомендовал использовать какой-либо шаблон без соответствующих модификаций. - person nvogel; 31.05.2010
comment
+1. Хорошими примерами являются те, которые не меняются со временем. Разработчики снова и снова говорят мне, что статья слишком старая, чтобы быть действительной, но тот факт, что ее все еще часто цитируют, говорит о многом. - person Joseph Ferris; 01.06.2010

Я бы, вероятно, создал «нормальную» структуру таблицы для «нормальных» битов данных (имя, адрес, телефон и т. д.), а затем имел отношение «один-> многие» к отдельной таблице «custom_fields», которая содержит три столбцы:

user_id (иностранный ey), тип поля (строка), данные (строка/блоб)

В качестве альтернативы вы можете просто добавить большой двоичный объект или текстовое поле в основную таблицу контактов, содержащее отформатированный список сопоставлений настраиваемых полей и значений (вы можете использовать BSON, JSON или YAML, чтобы упростить жизнь). Затем просто распакуйте данные, когда пользователь откроет контакт.

Если вам нужна более высокая производительность и возможность легко сортировать контакты по настраиваемым полям, вы можете заглянуть в базы данных, ориентированные на документы, такие как MongoDB, или даже в собственную поисковую систему (SOLR или Google.. idk..). , но может быть и интересным проектом!

Существует много-много способов связать настраиваемые поля и значения с записями в «обычной» базе данных. Просто выберите тот, который вы понимаете и можете написать быстро, и вперед. Я никогда не видел, чтобы компания/работодатель заботились о «соответствии стандартам» серверной системы хранения данных. Пока вы пишете какой-то скрипт экспорта или (как уже упоминалось) пишете плагины для поддержки бесшовного импорта/экспорта VCARD/XML , вы можете заявить, что ваше приложение "соответствует стандартам".

person Jordan    schedule 31.05.2010
comment
Интересное решение для настраиваемых полей! Это что-то очень близкое к тому, что я имел в виду.. Но все же, мне нужно было бы согласовать названия этих полей, - возможно, они могут быть взяты из стандарта vCard. Что касается БД, ориентированной на документы, это определенно было бы излишним. - person Gart; 31.05.2010

Что не так с обычным подходом к базе данных. Как вы сами упомянули, существует несколько разных форматов, и если вы реализуете один из них, вы нарушите совместимость с другими системами. С подходом к базе данных вы можете позже написать плагины для каждого формата, необходимого для связи с внешними приложениями - VCard или чем-то еще.

person Riho    schedule 31.05.2010
comment
Я обновил свой вопрос, чтобы отразить проблемы с обычным подходом к базе данных. - person Gart; 31.05.2010