Хранение контактных записей vCard / vcf в SQL - PullRequest
0 голосов
/ 18 марта 2012

Я хочу создать таблицу SQL для хранения записей контактов в формате vCard . У кого-нибудь есть готовый скрипт SQL CREATE для этого?

Ответы [ 2 ]

0 голосов
/ 07 августа 2018

В целом существует два способа реализации

Самый простой способ - это подход за одним столом. В большинстве случаев это сработает Один будет включать в себя все значения vcard, имена объектов, типы и т. Д. Большим преимуществом является скорость и простота. Может также подойти для баз данных nosql ... Хотя это грязно ...

2-й способ - это реляционный, то есть таблицы для типов, объектов и т. Д. Он не так прост, как подход с одной таблицей, но он использует преимущества SQL: минимальная повторяемость данных, возможность быстрого нарезания и нарезки и т. Д.

Я недавно пытался реализовать такой подход самостоятельно в MySQL vcards MySQL реализация

0 голосов
/ 03 июля 2012

У меня нет сценария, но у меня есть mySQL, который вы можете использовать.До этого я должен был упомянуть, что существуют два логических подхода к хранению vCards в SQL:

  1. Сохраните всю карту и позвольте базе данных искать, (возможно) огромные текстовые строки и обрабатыватьони в другой части вашего кода или даже на стороне клиента.например,

    СОЗДАТЬ ТАБЛИЦУ, ЕСЛИ НЕ СУЩЕСТВУЕТ vcards (name_or_letter varchar (250) НЕ ПУСТО,
    vcard текст НЕ ПУСТО,
    timestamp отметка времени НЕ ПУСТО по умолчанию CURRENT_TIMESTAMP при обновлении CURRENT_TIMESTAMP,
    ПЕРВИЧНЫЙ КЛЮЧ (username)
    ) ДВИГАТЕЛЬ = CHISSET ПО УМОЛЧАНИЮ MyISAM = utf8 COLLATE = utf8_bin;

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

Я наблюдал, как развивается vCard, и знает , что в будущем произойдут некоторые изменения, поэтому я использую тритаблицы.

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

Поскольку я позволил DBIx :: Class (да, я один из них), чтобы все базы данных работали так, (три таблицы), кажется, работают скореехорошо для меня, (хотя, очевидно, вы можете ужесточить типы, чтобы более точно соответствовать rfc2426 , но по большей части каждый фрагмент данных является просто текстовой строкой.)

Причина, по которойЯ не нормализую адрес этого человека, потому что у меня уже есть таблица адресов в моей базе данных, и эти три предназначены только для не-контактных данных пользователя.

 CREATE TABLE `vCards` (   
 `card_id` int(255) unsigned NOT NULL AUTO_INCREMENT,   
 `card_peid` int(255) DEFAULT NULL COMMENT 'link back to user table',   
 `card_acid` int(255) DEFAULT NULL COMMENT 'link back to account table',      
 `card_language` varchar(5) DEFAULT NULL COMMENT 'en en_GB',
 `card_encoding` varchar(32) DEFAULT 'UTF-8' COMMENT 'why use anything else?',
 `card_created` datetime NOT NULL,  
 `card_updated` datetime NOT NULL,
 PRIMARY KEY (`card_id`) )
 ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='These are the contact cards';

   create table vCard_profile (
    vcprofile_id int(255) unsigned auto_increment NOT NULL,
    vcprofile_version enum('rfc2426') DEFAULT "rfc2426" COMMENT "defaults to vCard 3.0",
    vcprofile_feature char(16) COMMENT "FN to CATEGORIES",
    vcprofile_type enum('text','bin') DEFAULT "text" COMMENT "if it is too large for vcd_value then user vcd_bin",
  PRIMARY KEY (`vcprofile_id`)
) COMMENT "These are the valid types of card entry";
INSERT INTO vCard_profile VALUES('','rfc2426','FN','text'),('','rfc2426','N','text'),('','rfc2426','NICKNAME','text'),('','rfc2426','PHOTO','bin'),('','rfc2426','BDAY','text'),('','rfc2426','ADR','text'),('','rfc2426','LABEL','text'),('','rfc2426','TEL','text'),('','rfc2426','EMAIL','text'),('','rfc2426','MAILER','text'),('','rfc2426','TZ','text'),('','rfc2426','GEO','text'),('','rfc2426','TITLE','text'),('','rfc2426','ROLE','text'),('','rfc2426','LOGO','bin'),('','rfc2426','AGENT','text'),('','rfc2426','ORG','text'),('','rfc2426','CATEGORIES','text'),('','rfc2426','NOTE','text'),('','rfc2426','PRODID','text'),('','rfc2426','REV','text'),('','rfc2426','SORT-STRING','text'),('','rfc2426','SOUND','bin'),('','rfc2426','UID','text'),('','rfc2426','URL','text'),('','rfc2426','VERSION','text'),('','rfc2426','CLASS','text'),('','rfc2426','KEY','bin');

create table vCard_data (
    vcd_id int(255) unsigned auto_increment NOT NULL,
    vcd_card_id int(255) NOT NULL,
    vcd_profile_id int(255) NOT NULL,
    vcd_prof_detail varchar(255) COMMENT "work,home,preferred,order for e.g. multiple email addresses",
    vcd_value varchar(255),
    vcd_bin blob COMMENT "for when varchar(255) is too small",
    PRIMARY KEY (`vcd_id`)
) COMMENT "The actual vCard data";

Это не лучший SQLно я надеюсь, что это поможет.

...